Лучший способ запускать код при освобождении объекта, для которого вы не можете переопределить 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
.
Кажется, что это будет именно то, что мне нужно, хотя и немного запутанное. Спасибо. – Garfbargle
Рад, что я мог помочь. –
Я пропустил «запутанную» часть вашего комментария раньше. Если есть что-то, что я могу объяснить лучше, пожалуйста, дайте мне знать. –