2012-03-15 73 views
0

我在NSManagedObjectContext類中有一個簡單的函數來幫助我從我的moc中獲得結果。我正在執行moc實例提供的performBlockAndWait塊內的結果。我需要返回一個autoreleased數組,並且通常來自moc的executeFetch已經完成了這個。但在這種情況下,即使我用__block指令聲明瞭數組,我仍然需要在塊內部保留數組。它看起來像塊一旦完成就釋放出來。 這是正常的嗎? 謝謝。瞭解塊中的變量(__block指令)

-(NSArray*)executeFetchWithEntityName:(NSString*)entityName predicate:(NSPredicate*)predicate{ 
NSEntityDescription *entity = [NSEntityDescription entityForName:entityName inManagedObjectContext:self]; 
if (!entity) { 
    NSLog(@"entity is nil in executeFetchWithEntityName: %@", entityName); 
    return [[[NSArray alloc]init]autorelease]; 
} 
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc]init]; 
[fetchRequest setEntity:entity]; 
if(predicate){ 
    [fetchRequest setPredicate:predicate]; 
} 
__block NSError *error = nil; 
__block NSArray *array = nil; 
[self performBlockAndWait:^{ 
    array = [self executeFetchRequest:fetchRequest error:&error]; 
    [array retain]; <------ IF I DONT RETAIN HERE, IT CRASHES FURTHER ON 
}]; 

NSLog(@"retain count: %i", array.retainCount); 

if (error) { 
    NSLog(@"error"); 
    array = nil; 
} 

[fetchRequest release]; 
return [array autorelease]; 

}

+2

Re。您使用retainCount:http://www.whentouseretaincount.com/ – 2012-03-15 17:19:18

+0

@StephenDarlington - 最後!一個明確的參考鏈接! – jrturton 2012-03-15 17:30:27

+0

jajaja excellent – 2012-03-15 17:45:25

回答

3

我懷疑performBlockAndWait具有該塊的內部自動釋放池包裝執行。因此,當您離開該塊時,由executeFetchRequest:error:返回的數組將被釋放,這就是爲什麼您需要保留它。

請注意,這不會是ARC下的問題; array指針會自動保留該數組。如果你有選擇,我建議切換到ARC。但在此期間,現在你知道發生了什麼。

+0

此外,根據MOC的併發類型,該塊甚至可能不會在同一個線程上執行。 – 2012-03-15 17:18:47

+0

我正在使用NSMainQueueConcurrencyType,我從主線程調用,所以它必須是同一個... – 2012-03-15 17:21:51