2014-02-13 60 views
0

我將我的NSManagedObject實例繼承並在父類中設置NSManagedObjectModelNSManagedObjectContext。在父級方法中訪問數據時,當我使用[self valueForKey:@"id"]時,我的objectModel似乎已經釋放或重置。這裏是一個例子:使用valueForKey後釋放的NSManagedObjectModel

//this outputs NSManagedObjectModel 
NSLog(@"model is %@",NSStringFromClass([model class])); 

NSLog(@"this id is %@", [self valueForKey:@"id"]); 

//this now outputs __NSCFString 
NSLog(@"model is %@",NSStringFromClass([model class])); 

爲什麼要用valueForKey做到這一點?

回答

1

你使用它的方式,它總是會失去引用,因爲你正在動態地創建對象,因此,當你完成使用你的子類時,你的NSManagedObjectContext將會被釋放。

你應該把你的NSManagedObjectContext的引用放在一個單例中,或者使用像這樣的工具方法來獲得引用。

#pragma mark - MOC 
- (void)initMoc 
{ 
    AppDelegate *delegate = [[UIApplication sharedApplication] delegate]; 
    self.managedObjectContext = delegate.managedObjectContext; 
} 
+1

你不應該把'NSManagedObjectContext'放在一個單例中。這是一個糟糕的設計選擇。 'NSManagedObjectContext'應該通過依賴注入傳遞給視圖控制器。另外,'AppDelegate'不是一個單身人士。 –

+0

一旦我將這些方法從我的模型父類中移出,並轉移到另一個輔助類中,我就可以開始正常工作,我的對象不再鬆散引用。我想我只是想太聰明。謝謝。 – bernieberg

1

id是保留字。你期望輸出是在那一行?如果你已經定義了一個名爲id的屬性,並期待輸出,你將遇到問題。

你的父母是什麼樣子的?如果您遵循Apple的模板,則您的NSManagedObjectContext應該分配到其他地方,通常在AppDelegate

你如何初始化這些NSManagedObject實例?如果你只是在做[[NSManagedObject alloc] init]那麼這也會給你帶來問題,因爲這不是NSManagedObject的指定初始值設定項。

+0

你能否指出調用我的屬性「id」的問題。我有時做到了這一點,從來沒有任何問題,關於它是一個保留字。 – alexandresoli

+1

這是一個保留字。當你調用'-valueForKey:「id」'時,你可以返回'self'而不是你認爲你回來的值。它可能在今天工作,明天可能無法工作,在將來的某個時候絕對不會工作。您應該已經收到關於使用它的警告,Objective-C中的警告非常重要。 –

+0

謝謝澄清,他們絕對應該至少發出警告,但它從未出現過。 – alexandresoli