2

В настоящее время я наблюдаю уведомление на протяжении всего срока службы объекта в категории . Тем не менее, я лечу метод dealloc, чтобы иметь место, чтобы удалить наблюдение. Это плохо, и мне неудобно, кроме того, у меня проблемы.Наблюдать и удалять NSNotification в пределах категории до dealloc

Есть ли у кого-нибудь идеи, как я могу прекратить наблюдение за уведомлением непосредственно перед тем, как объект будет освобожден из-под категории?

ответ

3

Лучший способ запускать код при освобождении объекта, для которого вы не можете переопределить dealloc, используется associated objects.

Объект, с которым вы связываетесь, будет освобождать связанные с ним связанные объекты при его освобождении. Пока это единственный владелец, тогда будет вызван dealloc связанного объекта. Используя класс, который вы контролируете для связанного объекта, это ваша точка входа.

Я получил демонстрацию с помощью этого трюка в дерегистрировать для КВО в GitHub репо https://github.com/woolsweater/UIViewController-WSSDataBindings

Контроллер связывает вспомогательный объект к себе:

- (void)WSSBind:(NSString *)bindingName 
    toObject:(id)target 
withKeyPath:(NSString *)path 
{ 
    WSSBinding * binding = [WSSBinding bindingWithBoundName:bindingName 
                onObject:self 
                toKeyPath:path 
                ofObject:target]; 

    // Attach the binding to both target and controller, but only make it 
    // owned by the target. This provides automatic deregistration when the 
    // target is destroyed, and allows the controller to unbind at will. 
    // Disregard the target and bound path for the key to allow mirroring 
    // Cocoa's unbind: method; this is simplest for the controller. 
    NSUInteger key = [self WSSAssociateKeyForBinding:bindingName]; 
    objc_setAssociatedObject(target, (void *)key, binding, 
          OBJC_ASSOCIATION_RETAIN_NONATOMIC); 
    objc_setAssociatedObject(self, (void *)key, binding, 
          OBJC_ASSOCIATION_ASSIGN); 
} 

И WSSBinding класс реализует dealloc к удалите наблюдателя, который был настроен в другом месте. Вы можете сделать то же самое для своей регистрации NSNotification.

+0

Кажется, что это будет именно то, что мне нужно, хотя и немного запутанное. Спасибо. – Garfbargle

+0

Рад, что я мог помочь. –

+0

Я пропустил «запутанную» часть вашего комментария раньше. Если есть что-то, что я могу объяснить лучше, пожалуйста, дайте мне знать. –