2011-05-02 80 views
0

當我嘗試使用NSManagedObject子類時遇到了一個奇怪的問題。我有代碼看起來是這樣的:保留在NSManagedObject崩潰

[self.navigationController popViewControllerAnimated:NO]; 
MyController *myController = [[MyController alloc] init]; 
myController.managedObject = managedObject; 

很簡單吧?但由於某種原因它會在用於設置「managedObject」的合成函數中崩潰。我試着用一些替代的功能是這樣的:

- (void) SetManagedObject:(NSManagedObjectSubClass*) obj 
{ 
    if (managedObject) 
     [managedObject release]; 

    managedObject = obj; 
--> [managedObject retain]; 
} 

這崩潰的保留呼叫......我很爲難,不知道從哪裏開始調試這一點。

回答

1

有幾個問題與您的代碼:

  • 如果您提供自定義的制定者,你的財產是不是一個合成屬性(刪除SetManagedObject:和使用@synthesized指令代替)
  • 你定製的setter被釋放它保留它之前的對象。所以managedObject可能已經釋放當您發送保留消息(這是不速之客)
  • SetManagedObject:有錯誤的情況下。如果您決定提供自定義設置器,請使用s etManagedObject:
  • 請勿將NS用作自定義子類的前綴(NS由Apple使用)。

我會使用合成屬性。刪除你的setter代碼,聲明@property(retain) XYManagedObjectSubClass managedObject;在你的.h文件中並在執行中使用@synthesize

+0

我認爲你需要更仔細地閱讀這個問題。如果你重新閱讀這個問題,你會發現我之前使用了合成函數,但是這個函數崩潰了,所以我故意創建了自己的函數(替換合成函數)來查看它崩潰的位置。原來它在保留上崩潰。如果你看看我的功能,我不釋放對象,我釋放PREVIOUS對象。有很大的不同。 – rhinoinrepose 2011-05-02 08:15:12

+0

你說得對。我誤解了這個問題 - 抱歉。另一個想法是,你正在傳遞一個過度釋放的對象obj。您是否已經嘗試使用「殭屍」工具運行您的代碼? – 2011-05-02 12:21:41

+0

看來我的「obj」obj沒有合適的保留和釋放次數。可能是因爲我直接訪問它,而不是使用self.obj。無論如何,現在修復感謝您的答案。 – rhinoinrepose 2011-05-03 17:16:13