我想在执行块之后使用结果数组,我的问题是,结果数组实例是否应该保留,因为它来自块?
__block NSError *error = nil;
__block NSArray *results;
[moc performBlockAndWait:^(void) {
results = [moc executeFetchRequest:fetchRequest error:&error];
[results retain];
}];
if(results){
//Do somehting
}
答案 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
}
也就是说,无论同步执行如何,您都希望从块内部到块外部保持硬保留。保留必须平衡。
总体规则是关于线程传输的;您正在将对象从一个执行线程(执行块的任何位置)传输到调用线程。在所有权转让中必须坚持不懈。