Effective Objective-C 2.0读书笔记(三)

第13条,用“方法调配技术”调试“黑盒方法”(重点)

  • 运行期与选择子(selector)相匹配的方法(IMP)也是能改变的,这使得不用通过源代码或继承子类覆写方法就能改变类本身功能。
  • IMP是指函数的指针。
  • 选择子可以和IMP之间动态连接。
  • 使用另一份实现来替换原有的方法实现,这个过程叫“方法调配”。开发者可以用“方法调配”技术向原有实现添加新功能(热更新、动态替换原有方法、逆向破解)。
  • 一般在调试程序的时候在运行期修改方法实现,也有滥用导致的安全问题。

关键词:method swizzling方法调配、IMP

第14条,理解“类对象”的用意

  • 特殊类型id能够指代任意OC的对象类型,好处就是告诉编译器不用检测类型也能响应。
  • 运行期检视对象类型称之为:类型信息查询。
  • 每个OC对象实例都是指向某块内存数据的指针。
  • 每个实例都有一个指向Class对象的指针,用来表明其类型,这些Class对象构成了类的继承体系。
  • 如果对象类型无法在编译期确定,那么就应该使用类型信息查询方法来探知。
  • 尽量使用类型信息查询方法来确定对象类型,而不要直接比较类对象,因为某些类对象可能实现了消息转发功能。

关键词:类型信息查询、isa、类对象

第15条,用前缀避免命名空间冲突

  • 同一个项目中,多人共用相同模块;开源社区中,第三方组建库。防止空间冲突,引入前缀概念。
  • 前缀可以和公司、应用程序相关联,最好是三个及以上字母组成。
  • 自己开发的程序库中用到了第三方库,应为其中的名称加上前缀。

关键词:命名空间冲突、前缀

 第16条,提供“全能初始化方法”

  • 可为对象提供必要信息以便其能完成工作的初始化方法叫做“全能初始化方法”。
  • 在类中提供一个全能初始化方法,并在文档中指明。
  • 若全能初始化方法与超类不同,则需覆写超类中的对应方法。
  • 如果超类的初始化方法不适用于子类,那么应该覆写这个超类方法,并在其中抛出异常。

关键词:全能初始化方法

 第17条,实现 description 方法

  • 在新实现的description方法中,打印出类的名字和指针地址,有助于调试。
  • 实现description方法返回一个有意义的字符串,用以描述该实例。
  • 若想在调试时打印出更详尽的对象描述信息,则应该实现debugDescription。

关键词:description、日志打印

第18条,尽量使用不可变对象

  • 尽量把对外公布出来的属性设置为只读,且在确实有必要的时候才公布。
  • 若某属性仅可于对象内部修改,则在“class-continuation分类”中将其由readonly属性拓展为readwrite属性。
  • 不要把可变的collection作为属性公开,而应该提供相关的方法,以此修改对象中的可变collection。

关键词:不可变对象、属性

原文地址:https://www.cnblogs.com/akiha/p/13267891.html