Ios 应用程序显示“UITableView已解除分配,而键值观察员仍在注册”

Ios 应用程序显示“UITableView已解除分配,而键值观察员仍在注册”,ios,objective-c,uitableview,key-value-observing,Ios,Objective C,Uitableview,Key Value Observing,从ViewController导航回上一个ViewController时,我的应用程序崩溃。 我已在observer注册为: [tblViewActvityCalender addObserver:self forKeyPath:@"contentSize" options:0 context:NULL]; [tblVi

从ViewController导航回上一个ViewController时,我的应用程序崩溃。 我已在observer注册为:

 [tblViewActvityCalender addObserver:self 
                          forKeyPath:@"contentSize" 
                             options:0 
                             context:NULL];
[tblViewActvityCalender removeObserver:self forKeyPath:@"contentSize"];
在delloc方法中,我将观察者删除为:

 [tblViewActvityCalender addObserver:self 
                          forKeyPath:@"contentSize" 
                             options:0 
                             context:NULL];
[tblViewActvityCalender removeObserver:self forKeyPath:@"contentSize"];
但我仍然会遇到应用程序崩溃,主要是在ios 8中。我做错了什么???谢谢你。。 事故日志:

*由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“UITableView类的实例0x7ab75400在键值观察者仍向其注册时被释放。当前观测信息: 上下文:0x0,属性:0x7a601490> ' *第一次抛出调用堆栈: 0 CoreFoundation 0x0268f946例外预处理+182 1 libobjc.A.dylib 0x02318a97 objc_异常_抛出+44 2 CoreFoundation 0x0268f86d+[N异常提升:格式:][141 3基金会0x01F46D4 NSKOVDROBIT + 379 4 UIKit 0x0076459b-[UIView版本]+89 5 UIKit 0x0077537a-[UIViewHierarchy removeFromSuperview]+733 6 UIKit 0x00793399-[UIScrollView从SuperView移除]+84 7 UIKit 0x007679bc-[UIView dealloc]+483 8 UIKit 0x0076459b-[UIView版本]+89 9 libobjc.A.dylib 0x0232ceb1 objc_版本+65 10 libobjc.A.dylib 0x0232dd32\u ZN12\u全局\u N\u 119AutoreleasePoolPage3popEPv+586 11 CoreFoundation 0x02571678自动释放池POP+24 12 CoreFoundation 0x025a876e _uCFRUnloopRUN+2270 13 CoreFoundation 0x025a7bcb CFRunLoopRunSpecific+443 14 CoreFoundation 0x025a79fb CFRUNLOOPSRUNINMODE+123 15图形服务0x0443824f GSEventRunModal+192 16图形服务0x0443808c GSEventRun+104 17 UIKit 0x006fa8b6 UIApplicationMain+1526 18 e-Care 0x0023311d干管+141 19 libdyld.dylib 0x035a8ac9启动+1 libc++abi.dylib:以NSException类型的未捕获异常终止 lldb

我建议你阅读

在对象中,使用

- (void)addObserver:(NSObject *)observer
         forKeyPath:(NSString *)keyPath
            options:(NSKeyValueObservingOptions)options
            context:(void *)context
因此,要删除观察器,您应该使用它

removeObserver:forKeyPath:context
然而,可能发生的情况是,在代码中称为self的对象被释放之前,UITableView被释放。 因此坠机


您应该确保此对象在解除分配之前取消注册,也许可以在ViewDidEvale中执行此操作。尝试以下操作,它可能会工作

删除视图中的观察者将消失,同时删除表代理。 如果您有任何正在运行的操作可能会影响表内容大小,请停止该操作或等待该操作,然后再移回其他屏幕。
今天我面临同样的问题

在删除视图或ViewController之前,您需要从屏幕中删除**tableview数据源、委派和tableview,然后在删除屏幕之后

只需在.m文件中添加以下代码

-(void)dealloc
{
     self.tableView.delegate = nil;
     self.tableView.dataSource = nil;
     self.tableView removeFromSuperview];
}

我希望它对你有用

你能把崩溃日志粘贴到这里吗?我已经把崩溃日志粘贴到我的帖子里了。。你可以检查一下…有什么解决办法吗?我用ViewDidDisplay试过了,但结果是一样的。