Effective Objective -C 第二章 对象、消息、运行期(2) - 读书笔记

11. 理解objc_msgSend的作用(消息传递机制)

  C语言使用“静态绑定”,也就是说,在编译期就能决定运行时所应调用的函数。在OC 中,如果向某对象传递消息,那就会使用动态绑定机制来决定需要调用的方法。

  消息由接受者、选择子及参数构成。给某对象“发送消息”也就相当于在该对象上“调用方法”。

  发给某对象的全部消息都要有“动态消息派发系统”来处理,该系统会查出对应的方法,并执行其代码。

12. 理解消息转发机制(如对象在收到无法解读的消息时,就会启动“消息转发机制”)

 。。。。:unrecognized selector sent to instance 0x87 (意思就是常见的 给一个不存在或没有实现的方法 发送了一个消息)

13.用方法“调配技术”调试“黑盒方法”

本条讲到如何互换两个方法的实现。想交换方法实现,可用下列函数:

 void method_exchangeImplementions(Method m1 , Method m2);此函数的两个参数表示待交换的两个方法实现,而方法实现则可以通过下列函数获得:

Method class_getInstanceMethod(Class aClass,SEL aSelector);此函数根据给定的选择从类中取出与之相关的方法。执行下列代码,即可交换前面提到的lowercaseString与uppercaseString方法实现:

Method originalMethod = class_getInstanceMethod([NSString class],@selector(lowercaseString));

Method swappedMethod = class_getInstanceMethod([NSString class],@selector(uppercaseString));

method_exchangeImaplementions(originalMethod,swappedMethod);

从现在开始,如果在NSString实例上调用lowercaseString,那么执行的将是uppercaseString的原有实现。实际应用中可以为某个类的方法添加新功能。

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

14. 理解“类对象”的用意

对象类型并非在编译期就绑定好了,而是要在运行期查找。

每个Objective-C 对象是想都是指向某块内存数据的指针。所以在声明变量是,类型后面要跟一个“*”字符,pointVariable可以理解成存放内存地址的变量,而NSString自身的数据就存于那个地址中。对于通用的对象类型id,由于其本身已经是指针,后面就不用跟一个“*”。

在类继承体系中查询类型信息: 意思是不要直接用==符号比较两个对象是否相等,而应该用一些检查对象类型的方法来比较,如“isKindOfClass:”能够判断出对象是否为某个类或其派生类的实例,"isMemberOfClass:"能够判断出对象是否为某个特定类的实例,“isEqual:”能够比较类对象是否等同。

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

 

posted on 2017-03-15 17:00  黄小逗  阅读(147)  评论(0)    收藏  举报

导航