2013-12-12 2 views
0

Может кто-нибудь подтвердить, если блок ниже превращается в цикл сохранения, пожалуйста? Обратите внимание, что блок вызывается SampleClass2, а не SampleClass1.Цикл сохранения блокировки iOS ARC

@interface SampleClass1{ 
    NSArray *_array; 
} 

@implementation SampleClass1 

-(void) doSomething { 
    SampleClass2 *sampleClass2 = [[SampleClass2 alloc] init]; 
    [sampleClass2 doAnother:^(NSArray *anotherArray){ 
     _array = anotherArray;  // _array is an ivar 
    }]; 
} 

@end 
+1

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

ответ

1
  • Сохраняет ли блок self? Да.
  • sampleClass2 сохранить блок? Может быть. Это зависит от того, что делает метод doAnother:. Без кода невозможно сказать.
  • Даже если предположить, что sampleClass2 сохраняет блок, существует ли цикл сохранения? № Существует соединение sampleClass2 -> the block -> self, но нигде из показанного кода не существует соединения от self до sampleClass2.
0

Может существовать цикл удержания, когда блок хранится внутри в ivar или в качестве свойства. Мы не видим, что делает -[SampleClass2 doAnother:] с блоком, поэтому мы не знаем.

Блок не фиксирует self неявно, ссылаясь на ivar _array, поэтому существует возможность создания эталонного цикла. Это зависит от того, кто сохраняет экземпляр SampleClass1 и что делает SampleClass2 с блоком.

+1

Все, что вы делаете внутри блока, не повлияет на сохранение циклов вне блока. Единственный случай цикла сохранения - это когда вы сохраняете сам блок, например: [self block:^(id smth) { [self function]; Также, как вы можете сказать «есть шанс» - либо есть цикл сохранения, либо нет :) }]; –

+1

@GrzegorzKrukowski Если метод 'doAnother:' заканчивает сохранение блока, тогда будет цикл ссылок. – rmaddy

+1

Не совсем - если SampleClass2 сохраняет (копирует) блок, он освободит его после того, как объект будет освобожден - и сам блок не сохранит SampleClass2 в любом месте. –

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