Objective c “究竟是什么?”;启用对objc“msgSend调用”的严格检查;什么意思?
这就是我所指的:Objective c “究竟是什么?”;启用对objc“msgSend调用”的严格检查;什么意思?,objective-c,xcode,Objective C,Xcode,这就是我所指的: 从我所读到的内容来看,objc\u msgSend基本上就是在发送Objective-c消息时在c级别发生的事情,并且将此设置设置为Yes可确保发送的消息具有与接收方所期望的相同数量的参数 这是正确的吗?另外,将此设置为Yes或No有哪些优点和缺点?我应该只在开发时将其设置为Yes,在生产时将其设置为No。您基本上是正确的,是的 苹果在默认情况下将其设置为“是”,因为这有助于更快地发现错误。将其设置为“否”的唯一原因是,您正在编译未更新的旧代码,以便在启用此选项时进行干净编译
从我所读到的内容来看,
objc\u msgSend
基本上就是在发送Objective-c消息时在c级别发生的事情,并且将此设置设置为Yes
可确保发送的消息具有与接收方所期望的相同数量的参数
这是正确的吗?另外,将此设置为
Yes
或No
有哪些优点和缺点?我应该只在开发时将其设置为Yes
,在生产时将其设置为No
。您基本上是正确的,是的
苹果在默认情况下将其设置为“是”,因为这有助于更快地发现错误。将其设置为“否”的唯一原因是,您正在编译未更新的旧代码,以便在启用此选项时进行干净编译
“启用objc_msgSend调用的严格检查”是编译时检查,而不是运行时检查,因此在生产中关闭它没有任何好处。苹果网站上有一个“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);
}
#包括
void foo(void*对象){
typedef void(*发送类型)(void*,SEL,int);
发送类型func=(发送类型)objc\u msgSend;
func(对象,sel_getUid(“foo:”),5);
}
不是我!我真的很想知道演示文稿在哪里,因为我看到了幻灯片,没有人解释就有点没用。是的,我明白了——演示文稿的文本被转录在第二个链接上。您还应该能够通过WWDC站点查看原始演示文稿。Cocoapods的每个播客都默认启用了此功能,看起来是这样的。默认情况下如何关闭此功能?