"Enable Strict Checking of objc_msgSend Calls" 到底是什么意思?

What exactly does "Enable Strict Checking of objc_msgSend Calls" mean?

这就是我指的:

根据我的阅读,objc_msgSend 本质上是当您发送 Objective-C 消息时在 c 级别发生的事情,并且此设置设置为 Yes 可确保发送的消息具有与接收方期望的相同数量的参数。

这是正确的吗?另外,将其设置为 YesNo 的优缺点是什么?我应该只在开发中将其设置为 Yes 而在生产中将其设置为 No 吗?

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

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

"Enable Strict Checking of objc_msgSend Calls" 是编译时检查,而不是 运行 时间,因此在生产中关闭它没有任何好处。

有一个 presentation "What's new in LLVM" on Apple's website (text of the presentation is 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);
}