如果我不想为Objective-C块传递任何信息,我应该使用什么关键字,NULL
或nil
?我这样问是因为Objective-C块是Objective-C对象(如我所知),但表示为函数指针.
NULL
和nil
都表示0x0
指针,但是它们在语义上是不同的.所以我很担心.
如果我不想为Objective-C块传递任何信息,我应该使用什么关键字,NULL
或nil
?我这样问是因为Objective-C块是Objective-C对象(如我所知),但表示为函数指针.
NULL
和nil
都表示0x0
指针,但是它们在语义上是不同的.所以我很担心.
块不表示为函数指针.它们被表示为块,在它们的声明中用^
符号表示.在幕后,唯一的相似之处就是调用语法.除此之外,它们都非常非常不同.
对它们调用方法通常很有用.例如,如果不使用垃圾收集,如果希望保留块以备以后使用,则需要调用块上的copy
方法.随着自动保留计数的出现,这甚至是复制块的唯一方法,因为圆弧指针强制转换规则阻止您使用Block_copy
宏.
NULL
是0
或(void*)0
,这取决于你的编译器.这适用于任何类型的指针.然而,由于Objective-C的语言规则,如果您试图向无法直接转换为id
的类型发送消息,则会收到警告(如果使用ARC,则会出现错误).
因为将消息发送到块很有用,所以应该使用nil
.
[编辑]让我们明确一点,使用nil
或NULL
将产生完全相同的二进制代码.你对常量的 Select 可能是基于你是否认为块是Objto-C对象.这在以前是一笔更大的交易,那时你必须自己写retain
和release
个电话,但现在ARC为你做所有的内存管理工作.
如果你在ARC出现之前使用过块,你可能会认为它们是Objective-C对象.如果没有,那么你可能不会认为/意识到他们是.在这种语言中,它们的身份仍有一些遗迹(例如,可以有一个指向块的__weak
或__unsafe_unretained
指针),但在大多数情况下,差异可以忽略不计. Select 一个,并努力坚持下go .我喜欢把我的积木想象成Objective-C对象.