我什么时候应该在objective-c中使用nil?

时间:2014-11-22 19:00:03

标签: objective-c null

我正在阅读一个问题,询问在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指针。enter image description here

https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSFileManager_Class/index.html#//apple_ref/occ/instm/NSFileManager/copyItemAtPath:toPath:error

2 个答案:

答案 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 *)。