Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c “究竟是什么?”;启用对objc“msgSend调用”的严格检查;什么意思?_Objective C_Xcode - Fatal编程技术网

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的每个播客都默认启用了此功能,看起来是这样的。默认情况下如何关闭此功能?