В приведенном ниже коде я правильно понимаю проблему сохранения цикла и будет ли цикл сохранения?сохранить цикл при вызове 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;
}
Предположительно, 'self' владеет/поддерживает сильную ссылку на' _importContext', '_importContext', вероятно, копирует блок, переданный в него, и имеет сильную ссылку на него, и блок, по-видимому, сохраняет' self', поэтому он определенно имеет потенциал для цикла удержания. Я не чувствую, что у меня хорошая ручка точно, когда циклы удержания происходят и являются проблемой, но я знаю, что (1) clang иногда предупреждает меня о них и (2) достаточно легко сделать слабый ссылку на себя и использование этого внутри блока, без недостатков (по крайней мере, не в вашем случае использования, а не в том, что я видел). – Isaac
Возможный дубликат [Objective-C/Blocks - не этот цикл сохранения?] (Http://stackoverflow.com/questions/15515093/objective-c-blocks-isnt-this-a-retain-cycle) –
вы правы, у меня есть сильная ссылка на _importContext. Компилятор не предупреждает о сохранении цикла здесь, и инструменты также не показывают цикл. Я просто хотел бы пояснить, что в этом случае на самом деле не может быть цикла, хотя сам захвачен в блоке ... – Ron