哪个是正确的,nil或NULL,标记“没有Objective-C块”?

时间:2011-04-23 18:52:17

标签: objective-c syntax objective-c-blocks

如果我想为Objective-C块传递任何内容,我应该使用哪个关键字NULLnil?我问这个是因为Objective-C块是Objective-C对象(据我所知),但表示为函数指针。

NULLnil都指示0x0指针,但它们在语义上是不同的。所以我很担心这个。

1 个答案:

答案 0 :(得分:83)

块不表示为函数指针。它们表示为块,并在其声明中用^符号表示。在幕后,唯一的相似之处是调用语法。否则,他们都非常非常不同。

调用方法通常很有用。例如,如果您不使用垃圾收集,则需要在块上调用copy方法,如果您希望稍后保留它们。随着自动保留计数的出现,这甚至是复制块的唯一方法,因为ARC指针强制转换规则阻止您使用Block_copy宏。

NULL取决于您的编译器,只是0(void*)0。这适用于任何类型的指针。但是,由于Objective-C的语言规则,如果您尝试将消息发送到无法直接转换为id的类型(如果使用ARC则出错),则会收到警告。

由于向块发送消息很有用,因此您应该使用nil


[编辑]让我们明确指出,使用nilNULL将导致完全相同的二进制代码。您对常量的选择应该基于您是否将块视为Objective-C对象。在您必须编写自己的retainrelease来电时,这是一个更大的交易,但现在ARC为您完成所有内存管理工作。

如果您在ARC之前使用了块,那么您可能认为它们是Objective-C对象。如果没有,那么你可能不会想到/意识到它们是。在语言中仍然存在一些他们身份的遗物(例如,你可以有一个__weak__unsafe_unretained指向一个块的指针),但在大多数情况下,差异可以忽略不计。选择一个并尝试坚持下去。我喜欢将我的块视为Objective-C对象。