【问题标题】:What does it mean that objc_msgSend() is passed "a pointer to the reciever's data"?objc_msgSend() 被传递“指向接收者数据的指针”是什么意思?
【发布时间】:2014-01-19 16:08:26
【问题描述】:

在 Apple 的 ObjC 运行时指南中,它描述了 objc_msgSend() 函数对动态调度的作用:

  1. 它首先找到选择器引用的过程(方法实现)。由于可以实现相同的方法 不同的类,它找到的精确过程 取决于接收者的类别。
  2. 然后它调用该过程,将接收对象(指向其数据的指针)以及指定的任何参数传递给它 方法。
  3. 最后,它将过程的返回值作为自己的返回值传递。

我在第二步中感到困惑,其中提到了“接收对象(指向其数据的指针)

那是什么?

谁能给我一个插图来澄清一下?

【问题讨论】:

  • “接收对象”是您正在调用的方法的“自身”。该方法需要知道什么是“自我”。

标签: ios objective-c macos objective-c-runtime


【解决方案1】:

这里会详细解释:http://www.friday.com/bbum/2009/12/18/objc_msgsend-part-1-the-road-map/

简而言之,每个 Objective-C 方法实际上都是一个 C 函数,它有两个 强制 参数,然后将任何参数传递给该方法。

即这个:

- (void) foo:sender;

- (void) foo:(id)sender;

真的是这个C函数吗:

void foo(id self, SEL _cmd, id sender);

指向数据的指针指的是self参数。通过该指向对象的指针,编译器生成对self 的任何实例变量的所有引用。

【讨论】:

  • 应该是- (void)foo:(id)sender 还是在未指定类型时自动使用id
  • @indragie 是的——编译器默认为(id)。这实际上不再推荐,但旧习惯很难改掉。固定。
  • 感谢您的帮助@bbum ~
猜你喜欢
  • 2021-07-31
  • 2021-01-04
  • 2016-03-06
  • 2021-03-22
  • 2021-04-21
  • 1970-01-01
  • 2011-01-27
  • 2012-11-02
  • 1970-01-01
相关资源
最近更新 更多