我正在阅读一个问题,询问在objective-c中NULL和nil之间的区别,在这里找到:NULL vs nil in Objective-C
我不确定是否完全了解这种差异。我知道NULL应该用于C风格的指针,nil用于id和对象指针。
我一直在阅读"在Objective-C第四版编程"作者:Stephen Kochan。本书中的一些代码示例违背了上述问题中描述的内容。
例如:
一个代码示例创建一个返回NSMUtableArray的方法,在该方法中,他尝试填充NSMutableArray,如果Array最后为空,则返回nil:
-(NSMutableArray *) someMethod
{
NSMutableArray *arr = [NSMutableArray array];
//try to populate arr
if([arr count])
{
return arr;
}
else
{
return nil;
}
}
稍后在另一个代码示例中,他将NULL用作指针对象
{
NSFileManager *fm = [NSFileManager defaultManager];
[fm copyItemAtPath: @"some file path" error: NULL]
}
查看NSFileManager文档,如果不想要错误信息,则表示传入nil表示NSError指针。
答案 0 :(得分:1)
您引用的代码示例正确使用它。 NSMutableArray *
是Objective-C对象指针类型。所以我们使用nil
。另一方面,copyItemAtPath:toPath:error:
的第二个参数具有类型NSError **
,它不是Objective-C对象指针类型。它是指针类型NSError *
的常规C指针(NSError *
是Objective-C对象指针类型;但是,指向它的指针不是)。所以我们使用NULL
。
基本上,它取决于"指向"什么。 NSMutableArray *
是指向ObjC对象类型的指针。另一方面,NSError **
是指向指针的类型。指向指针,指向原语的指针和指向其他指针的指针是常规的C指针。请注意,在ARC中只管理Objective-C对象指针类型。
至于文档,我相信这是由于Swift的加入。在Swift之前,旧文档说NULL
。在Swift中,各种C指针类型也使用nil
(对于空指针,它是一个常规常量,可以是符合NilLiteralConvertible
的任何类型的值)。
答案 1 :(得分:0)
基本上因为内存现在都由ARC管理,所以你可以在代码中使用或使用它们。但是,nil适用于所有Objective-C对象,例如NSError,而NULL用于C风格的东西,如(void *)。