2014-09-24 135 views
0

我在我的OSX應用程序中獲取給定類型的所有元素的方法(GEElementType是枚舉)。它在大多數情況下都能正常工作,但在某些情況下,[NSManagedObjectContext executeFetchRequest:error:]最終多次呼叫[NSManagedObject initWithEntity:insertIntoManagedObjectContext:]將新對象添加到MOC中......這是否是預期行爲?我可以一致地重現這一點,但我不明白它爲什麼這樣工作。核心數據查詢在託管對象上下文中插入新對象

這裏有一個代碼摘錄:

+ (NSArray*)elementsOfType:(GEElementType)elementType 
{ 
    return [GEElement findAllObjectsWithPredicate:[NSPredicate predicateWithFormat:@"elemtype == %d", elementType]]; 
} 

+ (NSArray*)findAllObjectsWithPredicate:(NSPredicate*)predicate 
{ 
    NSManagedObjectContext* context = [GEDataManager sharedInstance].managedObjectContext; 

    NSEntityDescription* entity = [self entityDescription]; 
    NSFetchRequest* request = [[NSFetchRequest alloc] init]; 
    [request setEntity:entity]; 
    [request setPredicate:predicate]; 

    NSError* error = nil; 
    NSArray* result = [context executeFetchRequest:request error:&error]; 
    if (error) 
    { 
     NSLog(@"%@", error.localizedDescription); 
    } 

    return result; 
} 

如果這有什麼差別,我使用的是Mogenerator使用自定義的基礎NSManagedObject子類。

我在子類中增加了一個斷點init和這裏的堆棧跟蹤:

#0 0x000000010003bf5a in -[GEElement initWithEntity:insertIntoManagedObjectContext:] at /.../DataModel/Human/GEElement.m:27 
#1 0x00007fff89166abc in -[NSManagedObject(_NSInternalMethods) _initWithEntity:withID:withHandler:withContext:]() 
#2 0x00007fff8916540e in -[NSManagedObjectContext(_NSInternalAdditions) _retainedObjectWithID:optionalHandler:withInlineStorage:]() 
#3 0x00007fff891be7f6 in -[NSMappedObjectStore executeFetchRequest:withContext:]() 
#4 0x00007fff89154e63 in -[NSPersistentStoreCoordinator executeRequest:withContext:error:]() 
#5 0x00007fff89152c1b in -[NSManagedObjectContext executeFetchRequest:error:]() 
#6 0x000000010000e50c in +[GEDataModelBase findAllObjectsWithPredicate:] at /.../DataModel/GEDataModelBase.m:72 
#7 0x00000001000c04da in +[GEElementTypes elementsOfType:] at /.../Helpers/GEElementTypes.m:75 
...etc... 

編輯:這裏是GEElement init方法,按要求。 27號線是第一個。

- (id)initWithEntity:(NSEntityDescription*)entity insertIntoManagedObjectContext:(NSManagedObjectContext*)context 
{ 
    self = [super initWithEntity:entity insertIntoManagedObjectContext:context]; 
    if (self) 
    { 
     // ...A bunch of property initializations here... 
    } 
    return self; 
} 

如果需要,我可以發佈所有屬性初始化,但沒有什麼特別的。

+0

你能用包含第27行的GEElement中的方法更新你的問題嗎? – quellish 2014-09-25 05:55:41

+0

我認爲你使用的是XML存儲? – quellish 2014-09-25 06:05:22

+0

嘿涼一下,我用包含第27行(第一個)的GEElement init方法更新了我的問題。我正在使用從JSON文件加載的內存存儲。 – Mariano 2014-09-25 14:26:13

回答

0

好的...所以我終於想出了導致這個問題的應用程序發生了什麼。

經過一番挖掘,我發現另一個意外的行爲發生在多重插入問題之前:我的一堆GEElement被釋放,但沒有從MOC中刪除。我不小心刪除了一些對象,這些對象構成了對它們有強烈參考的唯一數組。所以我固定我的問題通過添加創建MOC時,以下幾點:

managedObjectContext.retainsRegisteredObjects = YES; 

顯然,商務部沒有保留的對象,他們得到了釋放,但是當我試圖運行一個查詢,它重新創建缺少的對象..這是一種預期的行爲嗎?

相關問題