2015-12-17 2 views
0

В проекте у меня есть класс, который говорит «A», есть много других классов, которые наблюдают значения свойств класса «A».Удалить всех наблюдателей из класса

Иногда экземпляр класса «А» освобождается и наблюдает за сбоями, что приводит к сбою!

Есть ли способ удалить всех наблюдателей из класса «А»? Что-то вроде этого:

-(void) dealloc{ 
    [remove allObservers forKey:@"theKey"]; 
} 
+1

он подходит для наблюдателей, чтобы сохранить сильную ссылку на вещи, они наблюдающие ? – Wain

+0

Что делать, если вы добавляете наблюдателей в изменяемый массив и в realloc revome наблюдатели и removeAllObjects этого массива. –

+0

Можете ли вы рассказать, как вы добавляете Observer – vaibby

ответ

0

Вы должны сохранить класс «А» до тех пор, пока не будут найдены другие объекты, соблюдающие его значения свойств. Возможно, он освобождается, потому что вы неправильно обрабатываете его ссылку.

Вы должны проверить, требуется ли «A» «сильная» ссылка. Когда вам больше не понадобится «A» (т. Е. Вы вытаскиваете контроллер вида, вы обновляете таблицу, вы очищаете прокрутку), вы также должны удалить любого наблюдателя, прикрепленного к нему (и уметь это делать Это).

2

Короче говоря, к сожалению нет. КВО сделано так, что, к сожалению, it gets you in the end.

Я боролся с этой вещью раньше, и я нашел следующие два решения:

  1. Использование метода прокси для регистрации для наблюдения в вашей observee, который будет поддерживать список слабых ссылок на наблюдатель ,
    В идеале вам нужен прокси-метод для удаления наблюдателей, так что ваш список будет соответствующим образом обновлен (хотя, поскольку они являются слабыми ссылками в вашем списке, это не повредит, если какой-либо наблюдатель удалил себя, используя стандартный KVO вместо этого вашего прокси-метода, а затем deallocd).
    В случае, если ваше наблюдение будет освобождено, оно должно информировать всех наблюдателей (используя протокол) или просто удалить их самостоятельно. Для последнего, использование исключений может пригодиться, а также (я знает, что исключения есть зло в Obj-C, но что делать):

    @try 
    { 
        [self removeObserver:observee forKeyPath:@"path"]; 
    } 
    @catch (NSException * __unused exception) {} 
    
  2. Используйте некоторую абстракцию от КВО. Есть несколько проектов, которые приходят на ум, такие как RZDataBinding и MAKVONotificationCenter (несмотря на то, что это имя, он на самом деле относится к КВО)

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