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

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

推荐答案

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

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

NULL0(void*)0,这取决于你的编译器.这适用于任何类型的指针.然而,由于Objective-C的语言规则,如果您试图向无法直接转换为id的类型发送消息,则会收到警告(如果使用ARC,则会出现错误).

因为将消息发送到块很有用,所以应该使用nil.


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

如果你在ARC出现之前使用过块,你可能会认为它们是Objective-C对象.如果没有,那么你可能不会认为/意识到他们是.在这种语言中,它们的身份仍有一些遗迹(例如,可以有一个指向块的__weak__unsafe_unretained指针),但在大多数情况下,差异可以忽略不计. Select 一个,并努力坚持下go .我喜欢把我的积木想象成Objective-C对象.

Objective-c相关问答推荐

在 MacOS 上截屏

tableView:canEditRowAtIndexPath: 弹出 viewController 时崩溃

我应该打电话给 [super awakeFromNib] 吗?

如何在 Cocoa 中创建字符串的 MD5 哈希?

处理 ARC 中的指针对指针所有权问题

如何为代码自动格式化设置 Xcode 插件

setFont 已弃用?

NSMutableDictionary 线程安全

在 iOS 7 中检测后台应用刷新的用户设置

如何在 iPhone 上默认显示数字键盘?

iOS 7 - 键盘动画

使用 DatePicker 展开和折叠 UITableViewCells

iPhone 上 SQLite 的最佳 Cocoa/Objective-C 包装器库

隐藏 NSTableView 标头?

Objective-C 中的属性和实例变量

Core Text在iOS中计算字母框架

对 NSTimer 目标的弱引用以防止保留循环

获取临时目录中文件的文件路径和 URL

在 iOS 7 上运行应用程序时显示黑条(4 英寸视网膜显示屏)

ARC 下的 NSString 属性应该是强的还是复制的?