2010-09-26 111 views
0

遷移後,我的一個數值應該爲非零,現在顯示爲零。如果我不遷移,該值將保留其非零值。核心數據遷移失去NSNumber值

我第一次嘗試在這樣的管理對象設置數值:

[temp setNumUses:temp.numUses+1]; 

...但造成an'EXC_BAD_ACCESS」,所以我把它改爲:

int hold = ((int)[[temp valueForKey:@"numUses"] intValue]); 
hold++; 
[temp setNumUses:[[NSNumber alloc] initWithInt:hold]]; 

。 ..但是在遷移之後,這段代碼聲稱hold在運行新代碼之前被初始化爲一個值爲0的int,它的值明顯是1或更多(指的是僅使用1次的測試對象)。

當我不遷移核心數據數據庫時,NSNumber通過許多上下文保存和應用程序終止來保留其值。

我可能會丟失什麼?我有一些廣泛的代碼,修改其他地方存儲的數據庫中更改的NSManagedObjects的值,但不會篡改'numUses'。

想法?

回答

0

最簡單的解釋是,遷移某種程度上說服Core Data numUses是一個默認值爲零的新屬性。原因可能在於遷移模型,而不是您提供的分配代碼。

但是,家長的代碼確實表明你不太瞭解NSNumber,而錯過在其他地方使用NSNumber可能會導致你的問題。

NSNumber只是一個圍繞數值的對象包裝。您無法對其執行操作。這就是爲什麼這條線:

[temp setNumUses:temp.numUses+1]; 

...導致EXC_BAD_ACCESS。正如您發現的,您必須將NSNumber轉換爲int或NSDecimalNumber才能對其執行數學運算。

這條線:

[temp setNumUses:[[NSNumber alloc] initWithInt:hold]]; 

...將導致內存泄漏。您初始化一個NSNumber對象,但從不釋放它。在這種情況下(以及絕大多數情況),您應該使用類方法來創建NSNumbers,因爲它們會返回不會泄漏的自動釋放對象。所以:

[temp setNumUses:[NSNumber numberWithInt:hold]; 

一般來說,初始化方法參數中的任何對象是不好的做法。您正在尋求令人討厭的內存泄漏,這將很難追查到。泄漏報告可能不會顯示在調用方法的代碼中,而是在方法本身中顯示。

+0

嗨,我想指出,我在Objective-C編程方面相對較新。我在分配之前嘗試了NSNumber類的方法,但我想覆蓋所有的基礎,以確保一切。無論如何還是有NSNumber值爲0的問題。有沒有關於核心數據遷移模型的任何提示?要在我的代碼中遷移數據庫,我只需按照指南添加自動遷移,是否有更好的方法/使用該方法修復此問題的簡單方法呢? – 2010-09-27 16:36:55

+0

另外,爲什麼會:[temp setNumUses:temp.numUses + 1];結束工作?我前一段時間編寫了該代碼,此後已被替換,但在遷移之前它確實有效。是否有操作符方法寫入NSNumber?或者這些不存在?謝謝! – 2010-09-27 16:38:26

+0

NSNumber沒有操作符方法。你不能只爲NSNumber對象添加標量。如果你嘗試,你會實際增加對象的地址。我不知道你的移民失敗的原因。 – TechZen 2010-09-27 22:13:22