此代码取自Storing Preferences in iCloud上的Apples文档:
NSInteger reason = -1;
reason = [reasonForChange integerValue];
if ((reason == NSUbiquitousKeyValueStoreServerChange) ||
(reason == NSUbiquitousKeyValueStoreInitialSyncChange)) {
...
将reason
声明为非零值的原因是什么?
直接在NSInteger
来电中声明integerValue
有什么问题?
NSInteger = [reasonForChange integerValue];
if ((reason == NSUbiquitousKeyValueStoreServerChange) ||
(reason == NSUbiquitousKeyValueStoreInitialSyncChange)) {
...
这似乎是一个不同的情况,但如果我需要声明一个范围之外的东西它将被设置我通常做这样的事情:
NSInteger reason;
if (something) {
reason = [reasonForChange integerValue];
}
这是不正确的?它与NSInteger
有关吗?我错过了什么?
答案 0 :(得分:1)
将
reason
声明为非零值的原因是什么?
没有必要这样做。您在下面显示的较短的声明/初始化,即
NSInteger reason = [reasonForChange integerValue];
可以正常工作,因为没有代码路径使reason
保持不变。换句话说,程序永远不会读取初始化时分配的-1
值,从而无需进行分配。
如果我需要声明一个超出范围的东西,它会设置我通常做这样的事情:
NSInteger reason; if (something) { reason = [reasonForChange integerValue]; }
这是不正确的?
是的,这是不正确的,因为当something
评估为NO
时,reason
的值仍然未初始化。在这种情况下,您应该为reason
提供初始值,因为读取未初始化的局部变量是未定义的行为。
答案 1 :(得分:1)
您观察到可能的值,因为默认值0也是可能的值。请查看下面的枚举
NS_ENUM(NSInteger) {
NSUbiquitousKeyValueStoreServerChange NS_ENUM_AVAILABLE(10_7, 5_0),
NSUbiquitousKeyValueStoreInitialSyncChange NS_ENUM_AVAILABLE(10_7, 5_0),
NSUbiquitousKeyValueStoreQuotaViolationChange NS_ENUM_AVAILABLE(10_7, 5_0),
NSUbiquitousKeyValueStoreAccountChange NS_ENUM_AVAILABLE(10_8, 6_0)
};
如果你写这样的东西
NSInteger reason;
if (something) {
reason = [reasonForChange integerValue];
}
即使某些事情是假的,下面的条件也会成功。
if ((reason == NSUbiquitousKeyValueStoreServerChange) ||
(reason == NSUbiquitousKeyValueStoreInitialSyncChange)) {
...
你必须以
开头NSInteger reason = -1;