Effective Objective-C 2.0学习笔记(部分)

10.关联对象


(通过关联对象机制来把两个对象连起来;定义关联对象时可指定内存管理语意,用以模仿定义属性时采用的拥有关系与非拥有关系;只有在其他做法不可行时才应该选用关联对象,因为这种做法会引入难于查找的bug。)

11.理解objc_msgSend的作用


(消息由接收者、选择子及参数构成;发给某对象的全部消息都要由“动态消息派发系统”来处理,该系统会查出对应的方法,并执行其代码)

12.消息转发机制


(首先“动态方法解析”,失败则备援接收者,失败则完整的消息转发)可以用动态方法解析来实现@dynamic属性。example:calayer

13.method swizzling


(在运行期,可以向类中新增或替换选择子所对应的方法实现;使用另一份实现来替换原有的方法实现,这道工序叫方法调配,开发者常用此技术向原有实现中添加新功能;一般来说,只有调试程序的时候才需要在运行期修改方法实现,这种做法不宜滥用。)

14.理解类对象的用意


(每个实例都有一个指向class对象的指针,用以表明其类型,而这些cass对象则构成了类的继承体系;如果对象类型步伐在编译器确定,那么就应该使用类型信息查询方法来探知;尽量使用类型信息查询方法来确定对象类型,而不要直接比较类对象,因为某些对象可能实现了消息转发功能(nsproxy))

16全能初始化方法


(在类中提供一个全能初始化方法,并与文档中指明,其他初始化方法均应调用此方法;若全能初始化方法与超类不同,则需覆写超类中对应方法;如果超类的初始化方法不适用于子类,那么应该覆写这个超类方法,并在其中抛出异常)

21.异常处理


(只有发生了可使整个应用程序崩溃的严重错误时,才应使用异常;在错误不那么严重的情况下,可以指派委托方法来处理错误,也可以把错误信息放在nserror对象里,经由输出参数返回给回调者)

23.委托模式


(委托模式为对象提供了一套接口,使其可由此将相关事件告知其他对象;将委托对象应该支持的接口定义成协议,在协议中把可能需要处理的事件定义成方法;当某对象需要从另外一个对象中获取数据时,可以使用委托模式。若有必要,可实现含有位段的结构体,将委托对象是否能响应相关协议方法这一信息缓存至其中)

48.多用块枚举,少用for循环


遍历collection有四种方法。最基本的办法是for循环,其次是nsenumerator遍历及快速遍历法,最新、最先进的方法则是快枚举法;块枚举法本身能通过gcd来并发执行遍历操作,无须另外编写代码。而采用其他遍历方式则无法轻易实现这一点;若提前知道待遍历的collection含有何种对象,则应该修改块签名,指出对象的具体类型)

51.精简initialize与load的实现代码


无法在编译器设定的全局常量,可以放在initialize方法里初始化

42.多用GCD,少用performSelector系列方法


performSelector系列方法在内存管理方面容易有疏失,它无法确定将要执行的选择子具体是什么,因而arc编译器也就无法插入适当的内存管理方法;performSelector系列方法所能处理的选择子太过局限了,选择子的返回值类型及发送给方法的参数个数都受到限制;如果想把任务放在另一个线程上执行,那么最好不要用performSelector系列方法,而是应该把任务封装到块里,然后调用大中枢派发机制的相关方法来实现

43.掌握GCD及操作队列的使用时机


在解决对线程与任务管理问题时,派发队列并非唯一方案;操作队列提供了一套高层的objective-c api,能够实现纯gcd所具备的绝大部分功能,而且还能完成一些更为复杂的操作,那些操作若改用gcd实现,则需另外编写代码

31.在dealloc方法中只释放引用并解除监听


在dealloc方法里,应该做的事情就是释放指向其他对象的引用,并取消原来订阅的kvo或nsnotificationcenter的通知,不要做其他事情;如果对象持有文件描述符等系统资源,那么应该专门编写一个方法来释放此种资源。这样的类要和其使用者约定:用完资源后必须调用close方法;执行异步任务的方法不应在dealloc里调用;只能在正常状态下执行的那些方法也不应在dealloc里调用,因为此时对象已处于正在回收的状态了

33.以弱引用避免保留环


将某些引用设为weak,可避免出现“保留环”,weak引用可以自动清空,也可以不自动清空,自动清空是随着arc而引入的新特性,由运行期系统来实现在具备自动清空的弱引用上,可以随意读取其数据,因为这种引用不会指向已经回收过的对象

34.以“自动释放池块”降低内存峰值


自动释放池排布在栈中,对象收到autorelease消息后,系统将其放入最顶端的池里;合理运用自动释放池,可降低应用程序的内存峰值;@autorelease这种新式写法能创建出更为轻便的自动释放池

你可能感兴趣的:(iOS)