首页 > 解决方案 > 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

标签: iosobjective-ckey-value-observing

解决方案


我认为您添加了两次相同的观察者。总是打电话[scrollView removeObserver:self forKeyPath:keypath context:nil];之前[scrollView addObserver:self forKeyPath:keypath options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];


推荐阅读