我目前正在类别中的对象的整个生命周期中观察通知。但是,我正在调动dealloc方法以获得删除观察的位置。这感觉很糟糕,我对它感到不舒服,另外我遇到了问题。
是否有人知道如何在类别中取消分配对象之前停止观察通知?
答案 0 :(得分:3)
在释放无法覆盖dealloc
的对象时运行代码的最佳方法是使用associated objects。
您关联的对象将在解除分配时释放其强关联对象。只要这是唯一的所有者,就会调用关联对象的dealloc
。使用您为关联对象控制的类,这是您的入口点。
我已经演示了使用此技巧在GitHub回购中注销KVO 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
注册执行相同的操作。