У меня есть нечетный случай с ARC, NSNotificationCenter и блоком. Ниже приведен упрощенный пример кода. Из тестирования кажется, что управление памятью didSaveObserver
выполняется по желанию, то есть оно не создает цикл сохранения, и оно не является nil
до removeObserver:
.Предотвращение освобождения слабо назначенной переменной без создания цикла сохранения
Однако, мое понимание ARC заставляет меня думать, что это всего лишь случайность/причуда, и ARC может nil
didSaveObserver
до removeObserver:
. Наблюдение как didSaveObserver
никогда не сохраняется (единственное назначение - переменная weak
), то ARC может/(должен?) Мгновенно отключить ее.
Правильно ли я понял правила ARC? Если да, то как я могу гарантировать, что didSaveObserver
сохранен, чтобы он мог быть ненаблюдаемым, но не создать цикл сохранения?
self.willSaveObserver = [[NSNotificationCenter defaultCenter] addObserverForName:NSManagedObjectContextWillSaveNotification object:nil queue:nil usingBlock:^(NSNotification *note) {
id preSaveState = ...; //Store some interesting state about a Core Data object (the details aren't significant to this question).
__weak __block id didSaveObserver = [[NSNotificationCenter defaultCenter] addObserverForName:NSManagedObjectContextDidSaveNotification object:nil queue:nil usingBlock:^(NSNotification *note) {
//Unobserve the did save block. This is the tricky bit! didSaveObserver must be __weak to avoid a retain cycle, but doing so also means that the block may be dealloced before it can be unobsered.
[[NSNotificationCenter defaultCenter] removeObserver:didSaveObserver];
id postSaveState = ...;
//Perform work that uses pre & post save states.
}];
}];
Подробнее:
Если __weak
не добавил (так по умолчанию __strong
) сообщает, что инструменты есть сохранить цикл.
Я думаю, что это создает цикл сохранения, потому что инструменты говорят, что он это делает. Я обновил вопрос. –