应用程序正在崩溃显示“UITableView已取消分配,而键值观察者仍在其中注册”

问题描述 投票:1回答:3

我的应用程序在从ViewController导航回到之前的ViewController时崩溃了。我已在观察员处注册为:

 [tblViewActvityCalender addObserver:self 
                          forKeyPath:@"contentSize" 
                             options:0 
                             context:NULL];

在delloc()方法中,我将观察者移除为:

[tblViewActvityCalender removeObserver:self forKeyPath:@"contentSize"];

但我仍然遇到应用程序崩溃(主要是在ios 8中)。我做错了什么???先谢谢..崩溃日志:

*由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'类UITableView的实例0x7ab75400已取消分配,而键值观察者仍在其中注册。当前观察信息:(上下文:0x0,属性:0x7a601490>)'*第一次抛出调用堆栈:(0 CoreFoundation 0x0268f946 __exceptionPreprocess + 182 1 libobjc.A.dylib 0x02318a97 objc_exception_throw + 44 2 CoreFoundation 0x0268f86d + [NSException raise:format:] + 141 3基础0x01f496d4 NSKVODeallocate + 379 4 UIKit 0x0076459b - [UIView发布] + 89 5 UIKit 0x0077537a - [UIView(Hierarchy)removeFromSuperview] + 733 6 UIKit 0x00793399 - [UIScrollView removeFromSuperview] + 84 7 UIKit 0x007679bc - [UIView dealloc] + 483 8 UIKit的0x0076459b - [UIView的释放] + 89 9 libobjc.A.dylib 0x0232ceb1 objc_release + 65 10 libobjc.A.dylib 0x0232dd32 _ZN12_GLOBAL__N_119AutoreleasePoolPage3popEPv + 586 11的CoreFoundation 0x02571678 _CFAutoreleasePoolPop + 24 12的CoreFoundation 0x025a876e __CFRunLoopRun + 2270 13的CoreFoundation 0x025a7bcb CFRunLoopRunSpecific + 443 14的CoreFoundation 0x025a79fb CFRunLoopRunInMode + 123 15 GraphicsServices 0x0443824f GSEventRunModal + 192 16 GraphicsServices 0x0443808c GS EventRun + 104 17 UIKit 0x006fa8b6 UIApplicationMain + 1526 18 e-Care 0x0023311d main + 141 19 libdyld.dylib 0x035a8ac9 start + 1)libc ++ abi.dylib:以NSException类型的未捕获异常终止(lldb)

ios objective-c uitableview key-value-observing
3个回答
0
投票

试试下面,它可能会起作用......

  1. 在viewwilldisappear中删除观察者并删除表委托。
  2. 如果您有任何可能影响表格内容大小的运行操作,请在移回其他屏幕之前将其停止或等待。

0
投票

今天我面临同样的问题......

删除View或ViewController之前你需要从屏幕上删除** tableview detaSource,Delegate和tableview然后删除屏幕后

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

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

我希望它对你有用


-1
投票

我建议你阅读http://nshipster.com/key-value-observing/

在一个对象中,您使用

- (void)addObserver:(NSObject *)observer
         forKeyPath:(NSString *)keyPath
            options:(NSKeyValueObservingOptions)options
            context:(void *)context

因此删除你应该使用的观察者(你做了)

removeObserver:forKeyPath:context

但是,可能发生的是在取消分配对象(在代码中称为self)之前取消分配UITableView。因此崩溃。

您应该确保此对象在取消分配之前取消注册,可以在viewDidDisappear中进行

© www.soinside.com 2019 - 2024. All rights reserved.