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

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

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

块不被表示为函数指针。 它们被表示为块,并且在它们的声明中用^符号表示。 在引擎盖下,唯一的相似之处是调用语法。 否则,他们是非常非常不同的。

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

NULL是,根据你的编译器,只是0(void*)0 。 这将适用于任何types的指针。 但是,由于Objective-C的语言规则,如果您尝试向不能直接转换为id的types发送消息(如果使用ARC,则会发生错误),您将收到警告。

由于将消息发送到块可能很有用,因此应该使用nil


[编辑]让我们清楚,使用nilNULL将导致完全相同的二进制代码。 常量的select应该基于您是否将块视为Objective-C对象。 当你必须编写自己的retainrelease调用的时候,这是一个更大的交易,但现在ARC为你做了所有的内存pipe理工作。

如果您在ARC之前使用过块,那么您可能认为它们是Objective-C对象。 如果没有,那么你可能不认为/意识到他们是。 在语言中还有一些他们的身份__weak (例如,你可以有一个__weak__unsafe_unretained指针指向一个块),但是大多数情况下,这个差别是微不足道的。 挑一个,并试图坚持下去。 我喜欢将我的块视为Objective-C对象。