[Objective-C] send message 和 call method 的区别

转载 2015年07月08日 17:16:25

参考:

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 执行的。 



相关文章推荐

Objective-C编程之——发送消息Send Message

oc的第二课呢 我们主要给大家讲解了oc中的函数调用,即发送消息。毕竟调用方法是面向对象语言的重点呀~

Objective-C的消息(message)工作机制

看name mangling的时候,也讲到了Objective-C的name mangling,于是又重新读了一下Objective-C 2.0 programming Language以及Objec...

Effective Objective-C 2.0: Item 12: Understand Message Forwarding

这点很有意思,理清楚了Message Forward的过程(特别那个例子有意思),但是感觉 具体例子太少了~~ 难道是我没有理解透? Item 12: Understand Messag...

Objective-C Runtime 运行时之四:Method Swizzling

在上周associated object一文中,我们开始探索Objective-C运行时的一些黑魔法。本周我们继续前行,来讨论可能是最受争议的运行时技术:method swizzling。   ...

Objective-C Runtime 运行时之四:Method Swizzling

在上周associated objects一文中,我们开始探索Objective-C运行时的一些黑魔法。本周我们继续前行,来讨论可能是最受争议的运行时技术:method swizzling。 ...

Objective-C 运行时编程指南 之 Dynamic Method Resolution

可以实现 resolveInstanceMethod: 和 resolveClassMethod: 这两个方法分别动态的向给出的选择器提供实例方法和类方法。 可以使用 class_addMethod ...

Effective Objective-C 2.0: Item 17: Implement the description Method

如何重载description 和 debugDescription 赞 Item 17: Implement the description Method While debug...

[iOS]Objective-C Method Swizzling

文章转自cocochina 例子 以替换 NSArray 的 lastObject 方法为例: 在 NSArray 中添加需要替换 lastObject 的方法 – xxx_last...

Objective-C Method Swizzling

例子 以替换 NSArray 的 lastObject 方法为例: 在 NSArray 中添加需要替换 lastObject 的方法 – xxx_lastObject方法: import...

在objective-c中实现模板方法模式(template method)

在ios中实现模板方法(template method)模式
  • kyfxbl
  • kyfxbl
  • 2013-12-02 12:49
  • 3103
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)