这就是我所指的:
从我读过的内容来看,objc_msgSend
基本上就是当您发送Objective-C消息时在c级别发生的事情,并且此设置设置为Yes
可确保消息被发送的参数数量与接收者期望的数量相同。
这是对的吗?将此设置为Yes
或No
的优点和缺点是什么?我应该只将其设置为开发中的Yes
和生产中的No
吗?
答案 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);
}