哪个是正确的,无或NULL,标记“没有Objective-C块”?
如果我不想传递一个Objective-C块,我应该使用什么关键字, NULL
或nil
? 我问这是因为一个Objective-C块是一个Objective-C对象(据我所知),但表示为一个函数指针。
NULL
和nil
都表示一个0x0
指针,但它们在语义上是不同的。 所以我很关心这个
块不被表示为函数指针。 它们被表示为块,并且在它们的声明中用^
符号表示。 在引擎盖下,唯一的相似之处是调用语法。 否则,他们是非常非常不同的。
调用方法通常很有用。 例如,如果您不使用垃圾回收,则需要在块上调用copy
方法,以便稍后保留它们。 随着自动保留计数的出现,这甚至是复制块的唯一方法,因为ARC指针转换规则阻止您使用Block_copy
macros。
NULL
是,根据你的编译器,只是0
或(void*)0
。 这将适用于任何types的指针。 但是,由于Objective-C的语言规则,如果您尝试向不能直接转换为id
的types发送消息(如果使用ARC,则会发生错误),您将收到警告。
由于将消息发送到块可能很有用,因此应该使用nil
。
[编辑]让我们清楚,使用nil
或NULL
将导致完全相同的二进制代码。 常量的select应该基于您是否将块视为Objective-C对象。 当你必须编写自己的retain
和release
调用的时候,这是一个更大的交易,但现在ARC为你做了所有的内存pipe理工作。
如果您在ARC之前使用过块,那么您可能认为它们是Objective-C对象。 如果没有,那么你可能不认为/意识到他们是。 在语言中还有一些他们的身份__weak
(例如,你可以有一个__weak
或__unsafe_unretained
指针指向一个块),但是大多数情况下,这个差别是微不足道的。 挑一个,并试图坚持下去。 我喜欢将我的块视为Objective-C对象。