Objective c 哪一个是正确的,无还是空;“无目标-C块”吗;?

Objective c 哪一个是正确的,无还是空;“无目标-C块”吗;?,objective-c,syntax,objective-c-blocks,Objective C,Syntax,Objective C Blocks,如果我不想为Objective-C块传递任何内容,我应该使用什么关键字,NULL或nil?我这样问是因为Objective-C块是Objective-C对象(如我所知),但表示为函数指针 NULL和nil都表示0x0指针,但它们在语义上不同。所以我很担心这一点。块不表示为函数指针。它们被表示为块,这由它们声明中的^符号表示。在幕后,唯一的相似之处是调用语法。否则,它们都非常非常不同 对它们调用方法通常很有用。例如,如果不使用垃圾收集,则需要对块调用copy方法,以备以后使用。随着自动保留计数的出

如果我不想为Objective-C块传递任何内容,我应该使用什么关键字,
NULL
nil
?我这样问是因为Objective-C块是Objective-C对象(如我所知),但表示为函数指针


NULL
nil
都表示
0x0
指针,但它们在语义上不同。所以我很担心这一点。

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

对它们调用方法通常很有用。例如,如果不使用垃圾收集,则需要对块调用
copy
方法,以备以后使用。随着自动保留计数的出现,这甚至是复制块的唯一方法,因为圆弧指针强制转换规则阻止您使用
block\u copy

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

因为将消息发送到块可能很有用,所以应该对它们使用
nil


[编辑]让我们明确使用
nil
NULL
将产生完全相同的二进制代码。你对常量的选择可能是基于你是否认为块是Objto-C对象。这在以前是一笔更大的交易,那时你必须编写自己的
retain
release
调用,但现在ARC为你做所有的内存管理工作


如果您在ARC出现之前使用过块,您可能会认为它们是Objective-C对象。如果没有,那么你可能不会认为/意识到他们是。在语言中仍然有一些他们身份的遗迹(例如,您可以有一个
\uuuu弱
\uuuu不安全
指针指向一个块),但在大多数情况下,差异可以忽略不计。挑一个,试着坚持下去。我喜欢将我的块视为Objective-C对象。

+1例如,用于动画的UIView类方法可以有一个参数
completion
,该参数暗示为
(void(^)(BOOL finished))completion
,文档中说:可以为NULL。因此,我不确定过零是否是预期用途。请解释一下。@Nick Weaver您也可以对任何Objective-C类型使用
NULL
。首选
nil
的唯一原因是它满足编译器的要求,因为
nil
属于
id
类型,向
id
发送消息是有效的,而不是向空指针发送消息(它会发出警告)。由于块是对象,所以没有理由不对它们使用
nil
。谢谢您的回答。这是我关于函数指针的错误。我本来想讨论函数指针形式:),但我太困了…在块上调用
-invoke
是一个复杂的过程,因为它是未记录的、特定于实现的行为,可能会发生更改…并且可能不可移植。