调用一个函数,该函数采用我不打算使用的完成处理程序,我是使用 nil、NULL 还是其他东西?

Calling a function that takes a completion handler that I'm not going to use, do I use nil, NULL or something else?

提问人:mdb29 提问时间:2/14/2018 最后编辑:mdb29 更新时间:2/14/2018 访问量:501

问:

当调用一个将完成处理程序作为其参数之一的方法时,如果我不打算使用它,那么使用什么参数合适? 例如

 [self.navigationController dismissViewControllerAnimated:YES completion:NULL];

有很多关于 NULL 和 nil 之间差异的例子,我在想 NULL,因为我认为完成处理程序更像是 C++ 的东西,而不是特定于 Objective-c,但我可能吠错了树。

我使用 NULL、nil 还是其他方法?

编辑:对不起,我应该说得更清楚,我知道 nil 和 NULL 是等价的,并且约定使用 nil 作为对象,将 NULL 用于指针。我问了更多关于我使用哪一个作为完成处理程序的信息。

objective-c null 完成处理程序

评论

1赞 Itai Ferber 2/14/2018
它们是等效的,但按照惯例,它们用于对象,用于类对象,并且通常用于所有其他指针类型(包括指向对象的指针,如 .nilNilNULLNSError **
0赞 rmaddy 2/14/2018
Apple 自己的文档指南显示了块指针,例如完成处理程序。nil

答:

0赞 Smartcat 2/14/2018 #1

Apple 至少在他们的一些 Objective-C 文档中使用了 NULL。下面是一个示例

有关 Objective-C 中 nil 与 NULL 的一般讨论,请参阅此 SO

我刚刚在 Obj-C 中使用了 NULL 来匹配 Apple 的文档。在 Swift 中,使用 nil。

0赞 user3386109 2/14/2018 #2

Xcode 有一个“跳转到定义”功能,可用于回答这个问题。

从 开始,我们进入 MacTypes.hnil

#define nil __DARWIN_NULL

继 _types.h 之后,我们有__DARWIN_NULL

#define __DARWIN_NULL ((void *)0)

然后从开始将我们带到 stddef.hNULL

#define NULL ((void*)0)

所以和是一回事。按照约定,用于对象,并用于其他指针类型。nilNULLnilNULL

完成处理程序将 a 作为参数,而块是 Objective-C 对象,因此按照惯例,当不需要完成块时,应使用。blocknil

评论

0赞 mdb29 2/14/2018
所以我想我的下一个问题是在这种情况下,完成处理程序(块)是指针吗?我意识到这只是惯例,不会影响发生的事情。
0赞 user3386109 2/14/2018
@mdb29我修复了答案以更好地匹配更新的问题。