Ios 应用程序显示“UITableView已解除分配,而键值观察员仍在注册”
从ViewController导航回上一个ViewController时,我的应用程序崩溃。 我已在observer注册为: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
[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试过了,但结果是一样的。