当我注册一个对象foo以从另一个对象栏接收KVO通知时(使用addObserver:...),如果我然后解除分配foo,我是否需要在-dealloc中removeObserver:forKeyPath:向bar发送消息?
我正在使用键值观察.我有object_1(NSManagedObject)和其他一些对象观察者.当我从托管对象上下文中删除object_1时,我的程序崩溃了.
CoreData:错误:严重的应用程序错误.在Core Data更改处理期间捕获到异常.这通常是NSManagedObjectContextObjectsDidChangeNotification的观察者中的错误.
我可以将一些东西放到dealloc方法(或其他地方)来删除object_1的所有观察者吗?或者唯一合适的决定是在我即将从托管对象上下文中删除object_1并通过其他对象监听此通知(从object_1的观察者中删除自己)时发送通知?
有关此主题的各种问题,但没有一个问题可以回答我的问题.
removeObserver当对象被释放时,我想从一个对象.我正在使用KVO,因为需要观察多个项目,并且NSNotification在这种情况下具有巨大的开销.
这是场景:
(多个)对象被各种其他对象观察到.当observer取消分配时,我可以将其作为观察者删除.但是当observed取消分配时,我需要告诉所有人observers将自己移除为观察者.这该怎么做?
在dealloc的实现中,您不应该调用超类的实现.您可以覆盖此方法以处置除对象的实例变量之外的资源,例如:
- (void)dealloc {free(myBigBlockOfMemory); }
上面说我们不应该调用超类的实现.但在它下面说我们应该"通过消息将超级版本的dealloc合并到超级".所以两段之间似乎存在一些冲突.这一定是由于我错过了一些东西.希望有人能解释一下......
如果使用手动引用计数,则子类必须实现它们自己的dealloc版本,以允许释放对象消耗的任何其他内存 - 例如为解除分配的对象拥有的数据或对象实例变量的动态分配存储.在执行特定于类的释放后,子类方法应该通过消息将dealloc的超类版本合并到super:
- (void)dealloc {[companion release]; 自由(myBigBlockOfMemory); [super dealloc]; }