[Objective-C] send message 和 call method 的区别
2015-07-08 17:16
453 查看
参考:
http://stackoverflow.com/questions/2852381/calling-a-method-or-sending-a-message-in-objective-c
http://davedelong.tumblr.com/post/58428190187/an-observation-on-objective-c
Call method:
明确指定对哪个 object 执行哪个 method,执行时,在 object 在内存中的地址做固定的偏移找到 method 的代码,执行。效率高,但没有灵活性。
根据Dave的说法,call method 相当于是”主动语态“,明确知道哪个 object 的哪个 method 被执行。
Send message:
绝大多数情况下,[anObject doMethod:aParameter]; 和 C++ 中的 anObject->doMethod(aParameter); 的功能是一样的。
然而,[anObject doMethod:aParameter]; 会被编译器翻译成 objc_msgSend(anObject, @selector(doMethod:), aParameter);
最终执行 method 的 object 未必是 anObject,最终执行的 method 也未必是 anObject 的 doMethod。
objc_msgSend() 方法会在它的 method list 中做动态查询。比如,程序员可以修改该 method list,使得本该执行 selector A 的 method 的地方实际执行 selector B 的 method。object 可以判断它是否接受这个 method、是否将这个 method forward 给其他 object、是否对某个 method 执行不同的代码。
理论上,send message 会比 call method 慢一些,事实上,每次 send message 只比 call method 慢几纳秒,很微小。但是带来了很大的灵活性。
根据Dave的说法,send message 相当于是”被动语态“,关注点在于”执行method“,只要 method 被执行就可以了,不关心哪个 object 执行的。
http://stackoverflow.com/questions/2852381/calling-a-method-or-sending-a-message-in-objective-c
http://davedelong.tumblr.com/post/58428190187/an-observation-on-objective-c
Call method:
明确指定对哪个 object 执行哪个 method,执行时,在 object 在内存中的地址做固定的偏移找到 method 的代码,执行。效率高,但没有灵活性。
根据Dave的说法,call method 相当于是”主动语态“,明确知道哪个 object 的哪个 method 被执行。
Send message:
绝大多数情况下,[anObject doMethod:aParameter]; 和 C++ 中的 anObject->doMethod(aParameter); 的功能是一样的。
然而,[anObject doMethod:aParameter]; 会被编译器翻译成 objc_msgSend(anObject, @selector(doMethod:), aParameter);
最终执行 method 的 object 未必是 anObject,最终执行的 method 也未必是 anObject 的 doMethod。
objc_msgSend() 方法会在它的 method list 中做动态查询。比如,程序员可以修改该 method list,使得本该执行 selector A 的 method 的地方实际执行 selector B 的 method。object 可以判断它是否接受这个 method、是否将这个 method forward 给其他 object、是否对某个 method 执行不同的代码。
理论上,send message 会比 call method 慢一些,事实上,每次 send message 只比 call method 慢几纳秒,很微小。但是带来了很大的灵活性。
根据Dave的说法,send message 相当于是”被动语态“,关注点在于”执行method“,只要 method 被执行就可以了,不关心哪个 object 执行的。
相关文章推荐
- Three Sources of a Solid Object-Oriented Design
- Objective-C Runtime中的并发内存分配
- Objective-C Runtime
- Objective-C Runtime
- Objective-C Runtime
- Objective-C Associated Objects 的实现原理
- 论文提要“You Only Look Once: Unified, Real-Time Object Detection”
- java中object常用方法
- [Objective-C] 目标文件反编译得到Objecitve-C源文件
- JSONObject基本内容(三)
- Objective-C之定义函数
- reason: '* -[NSCFArray insertObject:atIndex:]: mutating method sent to immutable object'
- Serializable:writeObject/readObject有的限制?
- 身份证验证
- Object-c 纯手写方法CRC8,16,32,跟我用笔计算的一样,不过跟那些代码算法结果32位的不同
- Objective-C属性赋值过程
- Objective-C对象模型及应用
- Objective-C对象模型及应用
- 【小测试】你真的知道blocks在Objective-C中是怎么工作的吗?
- Neither BindingResult nor plain target object for bean