__block变量应保留在块中

时间:2011-10-18 05:09:19

标签: iphone objective-c cocoa-touch cocoa objective-c-blocks

我想在执行块之后使用结果数组,我的问题是,结果数组实例是否应该保留,因为它来自块?

__block NSError *error = nil;    
__block NSArray *results;

[moc performBlockAndWait:^(void) {        
    results = [moc executeFetchRequest:fetchRequest error:&error]; 
    [results retain];
}];
if(results){
   //Do somehting
}

3 个答案:

答案 0 :(得分:3)

我认为这将属于obj-c内存管理的一般所有权规则。如果您需要该阵列,您应该通过保留它来声明所有权,并在完成后释放它。

答案 1 :(得分:2)

如果收到自动释放的对象,它通常对当前方法调用的其余部分保持有效,甚至可以作为方法的结果返回。如果您需要将其存放以备将来使用,您必须保留它。

答案 2 :(得分:2)

为了迂腐,你会做类似的事情:

__block NSError *error = nil;    
__block NSArray *results;

[moc performBlockAndWait:^(void) {        
    results = [moc executeFetchRequest:fetchRequest error:&error]; 
    [results retain];
    if (!results) [error retain];
}];

if(results){
   //Do somehting
   [results release]; // or not -- assign it to something
} else {
   // Do something with error
   [error release]; // or autorelease
}

也就是说,无论同步执行如何,您都希望从块内部到块外部保持硬保留。保留必须平衡。

总体规则是关于线程传输的;您正在将对象从一个执行线程(执行块的任何位置)传输到调用线程。在所有权转让中必须坚持不懈。