Чтобы быть педантично правильным, вы должны сделать что-то вроде:
__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
}
То есть, вы хотите, чтобы жесткое сохранение поддерживалось изнутри блока наружу блока всегда и независимо от синхронного выполнения. Это удержание должно быть сбалансировано.
Общее правило сводится к переносу потоков; Вы переносите объекты из одного потока выполнения (где бы ни был выполнен блок) в вызывающий поток. При передаче права собственности должно быть трудно удержаться.