【问题标题】:When should I use nil in objective-c?我什么时候应该在objective-c中使用nil?
【发布时间】:2014-11-22 19:00:03
【问题描述】:

我正在阅读一个关于 Objective-c 中 NULL 和 nil 之间区别的问题,可在此处找到:NULL vs nil in Objective-C

我不确定是否完全理解其中的区别。我知道 NULL 应该用于 C 风格的指针,而 nil 应该用于 id 和对象指针。

我一直在阅读 Stephen Kochan 的“Objective-C 第四版编程”。书中的一些代码示例与上述问题中的描述不符。

例如:

一个代码示例创建了一个返回 NSMUtableArray 的方法,他尝试填充 NSMutableArray,如果数组最后为空,他返回 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 文档,它说如果不需要错误信息,则为 NSError 指针传递 nil。

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

【问题讨论】:

  • 所有 Objective-C 对象都用作指针,而不是值。所以对象的类型总是SomeType*。在您的示例中使用NULL 的原因是它是一个双指针,而不仅仅是一个单指针。另一种思考方式可能是您通常使用NULL 可能会取消引用,而nil 则不会。

标签: objective-c null


【解决方案1】:

您引用的代码示例正确使用了它。 NSMutableArray * 是一个 Objective-C 对象指针类型。所以我们使用nil。另一方面,copyItemAtPath:toPath:error: 的第二个参数的类型为NSError **,它不是Objective-C 对象指针类型。它是指向指针类型NSError * 的常规C 指针(NSError * 是Objective-C 对象指针类型;但是,指向它的指针不是)。所以我们使用NULL

基本上,它取决于“指向”什么。 NSMutableArray * 是指向 ObjC 对象类型的指针。另一方面,NSError ** 是指针到指针类型。 Pointer-to-pointer、pointer-to-primitive 和 pointer-to-anything-else 是常规的 C 指针。请注意,ARC 中只管理 Objective-C 对象指针类型。

至于文档,我相信是由于 Swift 的加入。在 Swift 之前,旧文档说 NULL。在 Swift 中,各种 C 指针类型也使用nil(这是一个通用常量,可以是符合NilLiteralConvertible 的任何类型的值)作为空指针。

【讨论】:

    【解决方案2】:

    本质上是因为内存现在全部由 ARC 管理,您可以在代码中使用或使用其中之一。但是,nil 适用于所有 Objective-C 对象,例如NSError 而 NULL 用于 C 风格的东西,如 (void*)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-26
      • 2010-12-30
      • 2012-06-10
      • 1970-01-01
      • 1970-01-01
      • 2010-10-05
      • 1970-01-01
      相关资源
      最近更新 更多