nil vs kNilOptions

问题描述 投票:5回答:4

我前段时间发现enum kNilOptions等于0.我尝试使我的代码最具可读性但是我想知道当你有采用选项参数的方法时最好使用什么,例如:

[NSData dataWithContentsOfFile:imageURL.path
                               options:kNilOptions
                               error:&error];

我经常在我阅读的很多代码中看到nil,但我认为kNilOptions会更准确。我经常看不到(几乎没有)kNilOptions。这有什么理由吗?

你认为使用它还是更好吗或坚持简单nil

ios objective-c null
4个回答
4
投票

我认为0kNilOptions更具可读性,并且有some evidencekNilOptions是“老”。

您应该使用nil来表示未初始化的Objective-C对象引用,并使用NULL来表示未初始化的C指针(void *char *等)。

如果0没有提供“无值”,则使用options,这是options NSDataReadingOptions的情况。


4
投票

kNilOptions是一个古老的常数,旨在证明0不仅仅是任何魔法零,而是代表“无选择”。在这个意义上它的使用是有效的,虽然我个人认为它在Objective-C上下文中很难看(它的大部分用法似乎都在C中),并带有k前缀和all。在developer.apple.com上搜索options:kNilOptionsoptions:0也表明options:0是他们的首选风格。

至于nil,它是Objective-C等价的对象的空指针,不应该用于代表数字0(就像这里的情况一样)。

当参数是包含其自己的“无选项”值的enum类型时,你应该使用它,但是在NSData的情况下,参数不是enum而是typedef'dNSUInteger,并且它没有自己的“没有选项” “价值定义。


1
投票

即使Apple使用它,如果您只是使用0作为NSEnum / NSOption值,AppCode会发出警告,因为您使用的是整数而不是Enum值。

所以你需要明确地将0强制转换为正确的枚举类型:

[NSData dataWithContentsOfFile:imageURL.path
                       options:(NSDataReadingOptions)0
                         error:&error];

或者使用kNilOptions这是一个匿名的枚举值:

[NSData dataWithContentsOfFile:imageURL.path
                       options:kNilOptions
                         error:&error];

我建议使用后来的解决方案kNilOptions而不是(NSDataReadingOptions)0,以避免手动编写C-cast。


对象指针也出现了同样的问题。

你需要显式地将0强制转换为指针:

[NSData dataWithContentsOfFile:imageURL.path
                       options:readOptionsMask
                         error:(void*)0];

或者使用nil作为指针本身的强制转换:

[NSData dataWithContentsOfFile:imageURL.path
                       options:readOptionsMask
                         error:nil];

每个人都会推荐后来的解决方案,nil而不是(void*)0,以避免手动编写C-cast。


0
投票

可以最终为零的各种事物用于不同的目的。不使用正确的代码可能不会影响代码,但是阅读代码的任何人都会产生怀疑,并且会因为验证代码是否有意义而陷入困境。

  • 0 =整数零。
  • 0.0 =双精度浮点数零。
  • '\0' = nul char,用作C字符串的分隔符。
  • NULL =一个不指向任何东西的C或C ++指针。
  • nil =一个Objective-C对象指针,它不指向任何对象(作为一个实现细节,nil == 0恰好评估为true,但不使用nil而不是0 / false)。
  • Nil =一个Objective-C类指针,它不指向任何类。
  • kNilOptions(在这种情况下)=一个枚举常量,描述没有选项。
© www.soinside.com 2019 - 2024. All rights reserved.