"启用严格检查objc_msgSend呼叫"究竟是什么意思?

Mik*_*e V 8 xcode objective-c

这就是我所说的:
在此输入图像描述

从我读过的内容来看,objc_msgSend当你发送一个Objective-C消息时,本质上是在c级发生的事情,并且这个设置被设置为Yes确保发送的消息具有与接收者期望的相同数量的参数.

它是否正确?也有什么优点和缺点,以将其设置为YesNo?我应该只Yes在开发和No生产中设置它吗?

Jos*_*oyd 6

你基本上是正确的,是的.

Apple默认将其设置为Yes,因为它有助于更​​快地发现错误.将其设置为No的唯一原因是因为您正在编译尚未更新的旧代码以使用此选项进行干净编译.

"启用严格检查objc_msgSend调用"是编译时检查,而不是运行时,因此在生产中将其关闭没有任何好处.


nie*_*bot 6

有一个介绍苹果的网站"什么在LLVM的新"(演讲的文字在这里).

看起来编译器现在(可选)严格检查对obj_msgSend的调用类型.您将使用正确类型的函数指针代替直接调用objc_msgSend.

给出的例子:

#include <objc/message.h>
void foo(void *object) {
  typedef void (*send_type)(void *, SEL, int);
  send_type func = (send_type)objc_msgSend;
  func(object, sel_getUid("foo:"), 5);
}
Run Code Online (Sandbox Code Playgroud)