理解块中的变量(__block指令)

时间:2012-03-15 17:00:54

标签: objective-c core-data objective-c-blocks

我在NSManagedObjectContext类别中有一个简单的函数来帮助我从我的moc中获取结果。我正在执行moc实例提供的performBlockAndWait块中的结果。我需要返回一个自动释放的数组,通常来自moc的executeFetch已经这样做了。但在这种情况下,我需要在块中保留数组,即使我使用__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];

}

1 个答案:

答案 0 :(得分:3)

我怀疑performBlockAndWait有一个内部自动释放池包装块的执行。因此,当您离开块时,executeFetchRequest:error:返回的数组将被释放,这就是您需要保留它的原因。

请注意,这不是ARC下的问题; array指针会自动保留数组。如果您有选项,我建议您切换到ARC。但与此同时,现在你知道发生了什么。