我前段时间发现枚举kNilOptions
等于0。
我尝试使我的代码最具可读性,但我想知道当你有采用选项参数的方法时最好使用什么,例如:
[NSData dataWithContentsOfFile:imageURL.path
options:kNilOptions
error:&error];
我经常在我阅读的很多代码中看到nil
,但我认为kNilOptions
会更准确。我经常(几乎从不)kNilOptions
经常看到。这有什么理由吗?
您认为使用它是否可以,或者仅仅坚持nil
更好?
答案 0 :(得分:6)
我认为0
比kNilOptions
更具可读性,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。