为什么在设置预期值之前向NSInteger声明一个初始非零值

时间:2016-02-23 11:35:49

标签: objective-c

此代码取自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有关吗?我错过了什么?

2 个答案:

答案 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;