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

时间:2015-01-04 23:05:10

标签: objective-c xcode

这就是我所指的:
enter image description here

从我读过的内容来看,objc_msgSend基本上就是当您发送Objective-C消息时在c级别发生的事情,并且此设置设置为Yes可确保消息被发送的参数数量与接收者期望的数量相同。

这是对的吗?将此设置为YesNo的优点和缺点是什么?我应该只将其设置为开发中的Yes和生产中的No吗?

2 个答案:

答案 0 :(得分:6)

你基本上是对的,是的。

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

"启用严格检查objc_msgSend呼叫"是一个编译时检查,而不是运行时间,因此在生产中关闭它是没有好处的。

答案 1 :(得分:6)

在Apple的网站上有一个presentation“LLVM中的新功能”(演示文稿的文字为here)。

看起来编译器现在(可选)严格检查对 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);
}