3

В приведенном ниже коде я правильно понимаю проблему сохранения цикла и будет ли цикл сохранения?сохранить цикл при вызове perfromBlock на self.managedObjectContext с ARC?

- (NSError *)importRoute:(NSDictionary *)route { 
    [self.importContext performBlockAndWait:^{ 
     [NSEntityDescription insertNewObjectForEntityForName:@"Entity" inManagedObjectContext:self.importContext]; 
     //do I get a retain cycle here? 
    }]; 
    ... 
} 

- (NSManagedObjectContext *)importContext { 
    if (!_importContext) { 
     id appDelegate = [[UIApplication sharedApplication] delegate]; 
     _importContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; 
     _importContext.parentContext = [appDelegate managedObjectContext]; 
    } 
    return _importContext; 
} 
+0

Предположительно, 'self' владеет/поддерживает сильную ссылку на' _importContext', '_importContext', вероятно, копирует блок, переданный в него, и имеет сильную ссылку на него, и блок, по-видимому, сохраняет' self', поэтому он определенно имеет потенциал для цикла удержания. Я не чувствую, что у меня хорошая ручка точно, когда циклы удержания происходят и являются проблемой, но я знаю, что (1) clang иногда предупреждает меня о них и (2) достаточно легко сделать слабый ссылку на себя и использование этого внутри блока, без недостатков (по крайней мере, не в вашем случае использования, а не в том, что я видел). – Isaac

+0

Возможный дубликат [Objective-C/Blocks - не этот цикл сохранения?] (Http://stackoverflow.com/questions/15515093/objective-c-blocks-isnt-this-a-retain-cycle) –

+0

вы правы, у меня есть сильная ссылка на _importContext. Компилятор не предупреждает о сохранении цикла здесь, и инструменты также не показывают цикл. Я просто хотел бы пояснить, что в этом случае на самом деле не может быть цикла, хотя сам захвачен в блоке ... – Ron

ответ

10

Существует цикл удержания, но он носит временный характер. Это сохранит цикл:

  • self сохраняет importContext
  • importContext сохраняет блок
  • блок сохраняет self

Как только блок завершает выполнение, importContext выпускает его. В этот момент отсчет сохранения блока становится равным нулю, и он освобождается. Когда он освобождается, он освобождает self.

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

+0

Спасибо за разъяснение. Я начинаю понимать, как это работает. Очень признателен. – Ron

Смежные вопросы