我有一个UIView
子类注册自己,一个观察者注册NSDictionary
中的对象。
当删除此视图时(删除其包含视图时),我在视图的dealloc方法中调用removeObserver:forKey
方法。
该应用程序稍后会崩溃,因为我的视图对象实际上并未从观察者中删除。我通过字典的observationInfo证实了这一点。
我可以看到,当我期待时,我的dealloc确实在运行。同样的方法可以与其他子类化的东西一起使用,例如UIButton
和UILabel
。
如果有帮助:其他子类化事物与此视图之间的唯一区别是其他事物是从NIB实例化的,其中此视图是用代码构建的......
知道可能阻止这种情况正确删除的原因吗?
答案 0 :(得分:5)
您可能多次致电addObserver:forKey:context:
。您必须完全平衡对addObserver:...
和removeObserver:...
你在哪里打addObserver:...
?你知道如何实例化nib加载的对象吗?您可能希望将addObserver:...
放入awakeFromNib
或initWithCoder:
。我经常对可能会或可能不会从nib文件创建的对象使用setup
方法。例如:
- (void)setup {
// Do setup work here
}
- (id)initWithFrame:(CGRect)frame {
self = [super init];
if (self) {
[self setup];
}
return self;
}
- (id)initWithCoder:(NSCoder *)coder {
self = [super initWithCoder:coder];
if (self) {
[self setup];
}
return self;
}