摘要:在内存管理方面容易有缺失。无法确定将要执行的选择子具体是什么,所以 ARC 无法插入适当的内存管理方法选择子的返回类型只能是 id,最多有两个参数。所以尽量避免使用这个东西。 下面来自苹果的文档Different messages require different memory management strategies for their returned objects, and it m...
阅读全文
摘要:相较于 NSDictionary 线程安全系统资源将要耗尽时,自动删减缓存自动删减“最久未使用的”对象不会自动拷贝键。因为有些键不支持拷贝操作可以和 NSPurgeableData 联合使用
阅读全文
摘要:performSelector 指定的方法没有被调用Invokes a method of the receiver on the current thread using the default mode after a delay.根据苹果的文档,performSelector:withObject:afterDelay: 在指定时间之后,在当前线程 调用一个方法。如果这个线程在指定时间之后...
阅读全文
摘要:在 OC 中,类的一个实例定义如下: /// Represents an instance of a class.struct objc_object { Class _Nonnull isa OBJC_ISA_AVAILABILITY;};即每一个对象,都有一个 isa 指针,指向它的 CLASS。而 CLASS 定义如下: /// An opaque type that repre...
阅读全文
摘要:原理类的方法类别中,选择子的名称通过映射表找到应该调用的方法。如下所示:OC 的运行时提供了几个方法可以操作这张表。可以向其中新增选择子,改变选择子的实现,或者交换选择子映射到的指针。在上图中,交换了 lowercaseString 和 uppercaseString 方法实现,新增了一个选择子 newSelector,修改了 capitalizedString 的实现。 方法交换实现 De...
阅读全文
摘要:问题有一个 1000 个 cell 的 tableView,刚刚进入界面时,contentOffset 为 0。用手快速滑动 tableView,直至最下面一个 cell 显示在屏幕上。这个过程中,cellForRow 被调用了几次呢? 手写 demo新建一个工程,只有一个 tableView,然后从上滚到下。在 cellForRowAtIndexPath方法中把 row 加到数组中,然后滚动停...
阅读全文
摘要:C 的函数调用方式C 语言使用静态绑定,即在编译器就可以决定运行时所应调用的函数。编译器在编译代码的时候就已经知道程序中有相应的函数,并直接生成调用函数的指令。函数地址硬编码在指令之中。 OC 中函数调用OC 中在对象上调用方法,称为“消息传递”。如下: id returnValue = [someObject messageName:parameter] 编译器看到这个之后,转化为标准的 ...
阅读全文
摘要:作用在已存在的类的 category 中,可以添加自定义属性。为何需要在分类中,因为类的实例变量的布局已经固定,使用 @property 已经无法向固定的布局中添加新的实例变量(这样做可能会覆盖子类的实例变量),所以我们需要使用关联对象以及两个方法来模拟构成属性的三个要素。 实现方法在头文件中如下: @interface NSObject (asso)///为NSObject这个类添加一个新的...
阅读全文
摘要:直接访问实例变量,不会经过 OC 的方法派发机制,速度比较块。会直接访问对象的实例变量对应的内存。 直接访问实例变量,不会调用“设置方法”。绕过了相关属性对应的“内存管理语义”。比如 copy。直接访问实例变量,不会触发 KVO。通过点语法访问实例变量,方便调试。因为可以新增断点。应该怎么做写入实例变量时,通过点语法。便于控制对属性的写入操作。读取实例变量时,直接访问。加快速度?初始化方法中,必须...
阅读全文
摘要:自动合成 (autosynthesis)@property 语法,会做下面两件事情 自动生成存取方法由编译器生成,编辑器里不会看到这些方法。向类中添加适当类型的实例变量在属性前加下划线,作为实例变量的名字。也可以通过@synthesize 语法指定实例变量的名字。 @synthesize firstName = _myFirstName 如何阻止自动合成自己实现存取方法实现其中一个方法,...
阅读全文
摘要:不能在栈上分配对象//Interface type cannot be statically allocatedNSString stackString;因为对象所占内存总是分配在“堆空间”中,而不会分配在栈上。分配在堆中的内存必须直接管理(引用计数),分配在栈上用于保存变量的内存则会在其栈帧弹出时自动清理。 字面量数组使用语法糖创建数组,若数组元素有 nil,会抛出异常。因为语法糖相当于先...
阅读全文