首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >哪个是正确的,nil或NULL,标记为“无Objective-C块”?

哪个是正确的,nil或NULL,标记为“无Objective-C块”?
EN

Stack Overflow用户
提问于 2011-04-24 02:52:17
回答 1查看 9.9K关注 0票数 64

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-04-24 03:07:05

块不表示为函数指针。它们被表示为块,这在它们的声明中由^符号表示。本质上,唯一的相似之处就是调用语法。除此之外,它们都是非常非常不同的。

在它们上调用方法通常很有用。例如,如果您不使用垃圾收集,那么如果您希望保留块以备以后使用,则需要使用来调用块上的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对象。

票数 83
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5766208

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档