【问题标题】:Understanding variables in blocks (__block directive)理解块中的变量(__block 指令)
【发布时间】:2012-03-15 17:00:53
【问题描述】:

我在 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];

}

【问题讨论】:

  • 回复。你对retainCount的使用:whentouseretaincount.com
  • @StephenDarlington - 终于!一个明确的参考链接!

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


【解决方案1】:

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

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

【讨论】:

  • 另外,根据 MOC 的并发类型,块甚至可能不在同一个线程上执行。
  • 我使用的是 NSMainQueueConcurrencyType,我是从主线程调用的,所以它必须是同一个......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-11
  • 2013-09-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多