在 dealloc 之前观察并删除类别中的 NSNotification
Observe and remove an NSNotification within a category before dealloc
我目前正在观察 类别 中对象的整个生命周期中的通知。但是,我正在调整 dealloc 方法以有一个位置来删除观察。这感觉很糟糕,我对此感到不舒服,此外我 运行 遇到了问题。
有谁知道如何在对象将在 类别 中被释放之前停止观察通知?
在无法覆盖 dealloc
的对象的重新分配处编写 运行 代码的最佳方法是使用 associated objects.
您关联的对象将在解除分配时释放其牢固持有的关联对象。只要它是唯一的所有者,关联对象的 dealloc
就会被调用。使用 class 您控制关联对象,这是您的入口点。
我在 GitHub 存储库 https://github.com/woolsweater/UIViewController-WSSDataBindings
中演示了如何使用此技巧注销 KVO
控制器将辅助对象关联到自身:
- (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
class 实现 dealloc
以删除在别处设置的观察者。您可以为 NSNotification
注册做同样的事情。
我目前正在观察 类别 中对象的整个生命周期中的通知。但是,我正在调整 dealloc 方法以有一个位置来删除观察。这感觉很糟糕,我对此感到不舒服,此外我 运行 遇到了问题。
有谁知道如何在对象将在 类别 中被释放之前停止观察通知?
在无法覆盖 dealloc
的对象的重新分配处编写 运行 代码的最佳方法是使用 associated objects.
您关联的对象将在解除分配时释放其牢固持有的关联对象。只要它是唯一的所有者,关联对象的 dealloc
就会被调用。使用 class 您控制关联对象,这是您的入口点。
我在 GitHub 存储库 https://github.com/woolsweater/UIViewController-WSSDataBindings
中演示了如何使用此技巧注销 KVO控制器将辅助对象关联到自身:
- (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
class 实现 dealloc
以删除在别处设置的观察者。您可以为 NSNotification
注册做同样的事情。