ios - UITableView 被释放,而键值观察者仍向其注册,仅在 iOS9、iOS10 中崩溃
问题描述
我在dealloc时删除了所有观察者,但我看起来崩溃似乎没有删除成功,我不知道为什么,每个人都可以帮助我。
这是我的代码和崩溃信息。我无法弄清楚我的代码有什么问题,任何可以帮助我的人。
@interface SYDiagnoseFloatingView()
@property (nonatomic, strong) UIImageView *imageView;
@property (nonatomic, strong) NSMutableArray<UIScrollView *> *scrollViews;
@end
@implementation SYDiagnoseFloatingView
移除观察者
- (void)dealloc {
for (UIScrollView *scrollView in self.scrollViews) {
[scrollView removeObserver:self forKeyPath:keypath];
}
}
添加观察者
- (void)addFloatingTargetView:(UIScrollView *)scrollView {
if ([self.scrollViews containsObject:scrollView]) {
return;
}
[self.scrollViews addObject:scrollView];
[scrollView addObserver:self forKeyPath:keypath options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];
}
堆栈跟踪 #0 线程
NSInternalInconsistencyException
An instance 0x108d20600 of class UITableView was deallocated while key value observers were still registered with it. Current observation info: <NSKeyValueObservationInfo 0x171428ba0> ( <NSKeyValueObservance 0x174a4b370: Observer: 0x1742f8280, Key path: contentOffset, Options: <New: YES, Old: YES, Prior: NO> Context: 0x0, Property: 0x17125db50> )
解析原始
0 CoreFoundation ___exceptionPreprocess + 124
1 libobjc.A.dylib objc_exception_throw + 56
2 CoreFoundation -[NSException initWithCoder:]
3 Foundation _NSKVODeallocate + 300
4 CoreFoundation _common_removeAllObjects + 188
5 CoreFoundation -[__NSArrayM dealloc] + 28
6 SoYoungMobile40 -[SYDiagnoseFloatingView .cxx_destruct] (SYDiagnoseFloatingView.m:19)
7 libobjc.A.dylib 0x000000019203c000 + 28432
8 libobjc.A.dylib objc_destructInstance + 92
9 libobjc.A.dylib object_dispose + 28
10 UIKit -[UIResponder dealloc] + 156
11 UIKit -[UIView dealloc] + 1676
12 SoYoungMobile40 -[SYDiagnoseFloatingView dealloc] (SYDiagnoseFloatingView.m:0)
13 CoreFoundation _common_removeAllObjects + 188
14 CoreFoundation -[__NSArrayM dealloc] + 28
15 libobjc.A.dylib 0x000000019203c000 + 139232
16 UIKit -[UIView dealloc] + 1644
17 libobjc.A.dylib 0x000000019203c000 + 139232
18 UIKit -[UIView dealloc] + 1644
19 libobjc.A.dylib 0x000000019203c000 + 139232
20 UIKit -[UIView dealloc] + 1644
21 UIKit -[UINavigationTransitionView dealloc] + 100
22 libobjc.A.dylib 0x000000019203c000 + 139232
23 UIKit -[UIView dealloc] + 1644
24 UIKit -[UILayoutContainerView dealloc] + 64
25 libobjc.A.dylib 0x000000019203c000 + 139232
26 UIKit -[UIView dealloc] + 1644
27 libobjc.A.dylib 0x000000019203c000 + 139232
28 CoreFoundation _CFAutoreleasePoolPop + 28
29 CoreFoundation ___CFRunLoopRun + 1668
30 CoreFoundation CFRunLoopRunSpecific + 444
31 GraphicsServices GSEventRunModal + 180
32 UIKit -[UIApplication _run] + 684
33 UIKit UIApplicationMain + 208
34 SoYoungMobile40 main (main.m:16)
35 libdyld.dylib _start + 4
解决方案
我认为您添加了两次相同的观察者。总是打电话[scrollView removeObserver:self forKeyPath:keypath context:nil]
;之前[scrollView addObserver:self forKeyPath:keypath options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];
。
推荐阅读
- mysql - 如果为真,则按条件加入查询
- python - 重新标记 pandas 上的所有索引
- elasticsearch - Elasticsearch 计算嵌套文档中某个值的出现次数
- azure - 如何将活动日志中的对象 ID 与用户、SPN 声明或 UPN 声明相关联
- cmake - 制作。项目文件生成后执行命令
- firebase - 无法从 Firebase 数据库中获取数据
- r - 获取 R 中函数的模型重要性和 adj R
- angular - Angular 7 HTTP Post 500 内部服务器错误
- javascript - 如何杀死击中敌人的武器子弹?移相器 2.7.5
- python - Discord.py - Storing player warns