首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >了解块中的变量(__block指令)

了解块中的变量(__block指令)
EN

Stack Overflow用户
提问于 2012-03-16 01:00:54
回答 1查看 281关注 0票数 0

我在NSManagedObjectContext类别中有一个简单的函数来帮助我从我的moc中获得结果。我在moc实例提供的performBlockAndWait块中执行结果。我需要返回一个自动释放的数组,通常情况下,moc的executeFetch已经做到了这一点。但在这种情况下,我需要将数组保留在块中,即使我使用__block指令声明了该数组。看起来它在代码块完成后就被释放了。这是正常的吗?谢谢。

代码语言:javascript
运行
复制
-(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];

}

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-03-16 01:13:27

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

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9724561

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档