调用含完成处理程序参数的方法时,无需使用该参数应传nil还是NULL?
在Objective-C中处理未使用的Completion Handler参数
首先明确一个核心点:在Objective-C里,绝大多数Completion Handler都是block类型,而block在ARC环境下属于Objective-C对象范畴,这种情况下你应该传入nil,而不是NULL。
为什么要区分?虽然底层实现上nil和NULL在某些场景下可能表现相似,但它们的语义完全不同:
nil是Objective-C对象的空值,专门用于表示“不存在的Objective-C对象”;NULL是C语言指针的空值,针对的是普通C指针(比如int *、char *这类)。
举个实际的例子,比如UIKit里的动画方法:
[UIView animateWithDuration:0.3 animations:^{ // 动画逻辑 } completion:nil]; // 这里传nil是标准写法
如果传NULL,虽然很多时候编译器不会报错,但这属于不符合编码规范的写法——因为API期望的是一个Objective-C block对象,用nil才是语义匹配的选择。
那有没有需要传NULL的情况?如果某个方法的Completion Handler是C风格的函数指针(而非Objective-C block),这时候传NULL才是正确的,但这种情况在Objective-C的API里非常少见,绝大多数Completion Handler都是block类型。
总结一下:
- 若Completion Handler是Objective-C block类型:传
nil - 若Completion Handler是C函数指针类型:传
NULL
内容的提问来源于stack exchange,提问作者mdb29
相关产品推荐
相关产品推荐

