2011-12-03 53 views
4

我有一個CoreData實體與一個NSNumber屬性(在模型中的整數16)。我有以下代碼:的iOS5 CoreData實體顯示錯誤的NSNumber價值,適用於iOS4的

NSLog(@"raw changeAmount=%d", changeAmount); 

NSNumber *changeNumber = [NSNumber numberWithInt:changeAmount]; 

NSLog(@"number changeAmount=%d = %@", [changeNumber intValue], changeNumber); 

record.changeAmount = changeNumber; 

NSLog(@"new changeAmount=%d", [record.changeAmount intValue]); 

changeAmount是值當我運行我的測試123000一個int。當我在iOS 4上測試時,一切正常並打印出123000.但是,如果我在iOS 5上運行相同的代碼,則值爲-8072或-25,536。像這樣:

raw changeAmount=123000 
number changeAmount=123000 = 123000 
new changeAmount=-8072 

iOS4和iOS5之間發生了什麼事情?我整個過程中都錯誤地設置了我的NSNumber屬性嗎?

它不會出現是一個整數大小的問題,因爲我改用整數32(這應該是所有一起)的模型,它仍然發生。所以我們沒有得到整數溢出或任何東西。

回答

5

我剛在CodeRunner

size_t shortSize = sizeof(short); 
size_t intSize = sizeof(int); 

short short123000 = 123000; 
int int123000 = 123000; 

NSString *format = @"\nshortSize  => %d\n" 
        @"int Size   => %d\n" 
        @"short with 123000 => %d\n" 
        @"int with 123000 => %d"; 

NSLog(format, shortSize, intSize, short123000, int123000); 

這導致運行此代碼:

shortSize   => 2 
int Size   => 4 
short with 123000 => -8072 
int with 123000 => 123000 

NB的大小以字節並且有8位的字節從而2 * 8 = 16位和4 * 8 = 32位。

我有一些我工作的應用程序的類似問題。看起來CoreData對於強制執行類型已經變得更加嚴格了。我被它發現了,但是我應該對我正在做的事情保持警惕,如果蘋果公司改變了他們的API,那麼它就不會像人們會抱怨的那樣行事,而是當API改變爲做它的事情時首先宣傳它只是不幸,並可能趕上人們。

正如你可以看到這是一個簡單的整數溢出,所以如果你知道你的範圍你可以工作很容易解決這個問題了。

+0

嗨保羅,感謝您的迴應!我在編輯我的文章時,你打字,因爲我認爲同樣的事情。我將我的模型更新爲int32s,但仍然在發生。我將假設更新模型時出現了問題,因爲-8072不是巧合。謝謝。 –

+0

我會猜測,雖然您更新了模型,但數值已經作爲-8072保存在您的數據庫中,因此,當您進行遷移時,遷移如何知道-8072不是您想要的?它不能僅僅假設價值已經溢出。 –

+0

啊發現了!我顯然正在更新錯誤的模型。我在更改之前創建了一個新版本,將新版本設置爲當前版本,並且我認爲我正在編輯新版本,但唉,不。我將舊模型更改回int16,將新模型更改爲int32,現在按預期工作。 –