переменные __block должны быть сохранены в блоке - PullRequest
3 голосов
/ 18 октября 2011

Я хочу использовать массив результатов после выполнения блока, мой вопрос: следует ли сохранять экземпляр массива результатов, поскольку он был создан из блока?

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

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

Ответы [ 3 ]

3 голосов
/ 18 октября 2011

Я думаю, это относится к общему правилу владения для управления памятью obj-c.Если вам нужен этот массив, вы должны претендовать на право собственности, сохранив его и освободив его, когда закончите.

2 голосов
/ 18 октября 2011

Чтобы быть педантично правильным, вы должны сделать что-то вроде:

__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
}

То есть, вы хотите, чтобы жесткое сохранение поддерживалось изнутри блока наружу блока всегда и независимо от синхронного выполнения. Это удержание должно быть сбалансировано.

Общее правило сводится к переносу потоков; Вы переносите объекты из одного потока выполнения (где бы ни был выполнен блок) в вызывающий поток. При передаче права собственности должно быть трудно удержаться.

2 голосов
/ 18 октября 2011

Если вы получаете автоматически освобожденный объект, он обычно остается действительным до конца текущего вызова метода и даже может быть возвращен как результат метода.Если вам нужно сохранить его для дальнейшего использования, вы должны сохранить его.

...