Как слабо удерживаемый блок может вызвать цикл сохранения при захвате «я» - PullRequest
1 голос
/ 20 декабря 2011

У меня есть класс со свойством, которое является слабой ссылкой на блок.

@interface BlockTest : NSObject
    @property (nonatomic, weak) void(^testBlock)();
@end

В другой точке класса я использую этот блок следующим образом:

- (void)foobar {
    self.testBlock = ^{
        [self doSomething];
    };
}

Компилятор (Apple LLVM 3.0) жалуется, что может существовать цикл сохранения, потому что self здесь строго фиксируется.Но я не вижу, как это приводит к циклу сохранения, потому что сам блок является ссылкой __weak, так что все должно быть в порядке.Если я правильно понял слабые ссылки ARC, когда метод -foobar возвращает блок, переданный в self.testBlock, он должен быть освобожден (если не хранится в другом месте) и, таким образом, также освободить self.

В чем причина, по которой компиляторвсе еще думает, что может быть цикл сохранения?

1 Ответ

8 голосов
/ 20 декабря 2011

Блоки сильно захватывают объекты внутри них независимо от того, как на сам блок ссылаются.Предупреждение о сохранении цикла - это всего лишь предупреждение о возможности.Если вы знаете, исходя из контекста своего приложения, что это использование не приведет к циклу сохранения, вы можете спокойно его проигнорировать.Чтобы избавиться от предупреждения, вы можете передать себя через посредника, сильного или слабого:*

...