nil vs kNilOptions

时间:2014-07-15 12:20:54

标签: ios objective-c null

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

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

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

您认为使用它是否可以,或者仅仅坚持nil更好?

4 个答案:

答案 0 :(得分:6)

我认为0kNilOptions更具可读性,kNilOptions nil是"旧"。

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

如果options没有提供"无值",请使用{{1}},some evidence就是这种情况。

答案 1 :(得分:4)

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

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

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

答案 2 :(得分:0)

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

  • 0 =整数零。

  • 0.0 =双精度浮点数零。

  • '\0' = nul char,用作C字符串的分隔符。

  • NULL =一个不指向任何内容的C或C ++指针。

  • nil =一个Objective-C对象指针,它不指向任何对象 (作为实施细节,nil == 0恰好评估为 true ,但不使用nil代替 0 / false)。

  • Nil =一个Objective-C类指针,它不指向任何类。

  • kNilOptions(在本例中)=一个枚举常量,描述没有选项。

答案 3 :(得分:0)

即使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。