2012-03-15 27 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