2013-09-30 89 views
1

在我的應用程序中,我爲CoreData堆棧使用了MagicalRecord,並且出現了NSManagedObject的奇怪行爲。我在我的DB類中有這種方法,它從數據庫中提取Stuff實體的所有條目。我從另一個類調用這個方法,並且在這個getStuff方法中,我得到了正確的值,可以在下面的日誌語句中打印出來。將NSManagedObjects數組傳遞給另一個方法後,其中有空值

-(NSArray*) getStuff 
{ 
    NSManagedObjectContext * managedObjectContext = [NSManagedObjectContext MR_contextWithStoreCoordinator:self.psc]; 

    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Stuff"]; 

    NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"idNumber" ascending:YES]; 

    [request setSortDescriptors:[NSArray arrayWithObjects:sort, nil]]; 

    NSError *error = nil; 
    NSArray *arr = [managedObjectContext executeFetchRequest:request error:&error]; 

    for (Stuff *stuff in arr) { 
     NSLog(@"stuff fN: %@",stuff.idNumber); 
    } 

    if (arr) 
     return arr; 

    return [NSArray array]; 
} 

但是,通過此方法返回到另一個類的數組包含所有這些對象中的空值。

// -- some othe class 
// call DB to check if we have stuff there 
NSArray* stuff = [database getStuff]; 

for (Stuff *stuff in stuff) { 
     NSLog(@"stuff fN: %@",stuff.idNumber); 
    } 

有沒有人知道爲什麼會發生這種情況?任何形式的幫助都非常感謝!

回答

3

您的getStuff方法創建一個新的NSManagedObjectContext,它是(假設您使用ARC進行編譯)在方法的末尾解除分配。被管對象在它們被創建的上下文中「活着」。在上下文被釋放後訪問它們的屬性不起作用。

+0

這是真的很有幫助。解決我的問題,謝謝馬丁 – xrnd

1

假設你設置與MagicalRecord您的CoreData堆棧可以使用的[NSManagedObjectContext MR_contextForCurrentThread]代替[NSManagedObjectContext MR_contextWithStoreCoordinator:self.psc]

+0

我用它來使用它,但事情是我有兩個不同的商店(DB),我必須管理,這就是爲什麼我使用[NSManagedObjectContext MR_contextWithStoreCoordinator:self.psc]區分我打電話給商店。你知道我可以做不同的方式嗎?! –

+0

啊,那樣...那麼恐怕你需要用CoreData重新設計你的工作。正如@Martin R提到的那樣,使用ARC,您的上下文會在'getStuff'結尾解除分配。您需要在範圍內保持對您的上下文的強大引用,在這個範圍內您使用它的對象。如果它是類 - 使上下文成爲類的屬性,並使用該類的init中的存儲協調器初始化它。如果在類之間共享對象(以及它們的上下文),考慮創建單例,例如在'contextOfDB1'和'contextOfDB2'屬性中保存上下文。 –

+0

謝謝你... privet Donecku; ) –

相關問題