"Enable Strict Checking of objc_msgSend Calls" 到底是什么意思?
What exactly does "Enable Strict Checking of objc_msgSend Calls" mean?
这就是我指的:
根据我的阅读,objc_msgSend
本质上是当您发送 Objective-C 消息时在 c 级别发生的事情,并且此设置设置为 Yes
可确保发送的消息具有与接收方期望的相同数量的参数。
这是正确的吗?另外,将其设置为 Yes
或 No
的优缺点是什么?我应该只在开发中将其设置为 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);
}
这就是我指的:
根据我的阅读,objc_msgSend
本质上是当您发送 Objective-C 消息时在 c 级别发生的事情,并且此设置设置为 Yes
可确保发送的消息具有与接收方期望的相同数量的参数。
这是正确的吗?另外,将其设置为 Yes
或 No
的优缺点是什么?我应该只在开发中将其设置为 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);
}