2016-02-23 50 views
0

此代碼是從蘋果的文檔採取Storing Preferences in iCloud之前宣佈的inital非零值NSInteger的:爲什麼設定預期值

NSInteger reason = -1; 

reason = [reasonForChange integerValue]; 

if ((reason == NSUbiquitousKeyValueStoreServerChange) || 
    (reason == NSUbiquitousKeyValueStoreInitialSyncChange)) { 
    ... 

什麼是聲明reason爲非零值的原因是什麼?

integerValue呼叫中直接聲明NSInteger有什麼問題?

NSInteger = [reasonForChange integerValue]; 

if ((reason == NSUbiquitousKeyValueStoreServerChange) || 
    (reason == NSUbiquitousKeyValueStoreInitialSyncChange)) { 
    ... 

這似乎是一種不同的情況,但如果我需要聲明,將其設置範圍之外的東西,我常做這樣的事情:

NSInteger reason; 

if (something) { 
    reason = [reasonForChange integerValue]; 
} 

那是不正確的?這與NSInteger有關嗎?我錯過了什麼?

回答

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; 
+0

這就是答案。我知道我錯過了一些東西,ENUM把我扔了,當然0是一個可能的值。謝謝! – Cai

1

reason聲明爲非零值的原因是什麼?

這樣做沒有意義。更短的聲明/初始化你在下面顯示,即

NSInteger reason = [reasonForChange integerValue]; 

會工作得很好,因爲離開reason沒有不變的代碼路徑。換句話說,初始化時分配的值不會被程序讀取,從而無需分配任務。

,如果我需要聲明,它會成爲我常做這樣的事情的範圍之外的東西:

NSInteger reason; 

if (something) { 
    reason = [reasonForChange integerValue]; 
} 

那是不正確的?

是的,這是不正確的,因爲當something計算結果爲NOreason值保持未初始化。在這種情況下,您應該提供reason初始值,因爲讀取未初始化的局部變量是未定義的行爲。

+0

約'好點reason'未初始化! – Cai