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对象则构成了类的继承体系。
- 如果对象类型无法在编译期确定,那么就应该使用类型信息查询方法来探知。
- 尽量使用类型信息查询方法来确定对象类型,而不要直接比较类对象,因为某些对象可能实现了消息转发功能。
浙公网安备 33010602011771号