UITableView被解除分配,而键值观察者仍在其中注册,只是在iOS9和iOS10中崩溃

UITableView被解除分配,而键值观察者仍在其中注册,只是在iOS9和iOS10中崩溃,ios,objective-c,key-value-observing,Ios,Objective C,Key Value Observing,我在解除锁定时移除了所有的障碍,但我看起来崩溃似乎并没有移除成功,我不知道为什么,每个人都可以帮助我 @interface SYDiagnoseFloatingView() @property (nonatomic, strong) UIImageView *imageView; @property (nonatomic, strong) NSMutableArray<UIScrollView *> *scrollViews; @end @implementation SYD

我在解除锁定时移除了所有的障碍,但我看起来崩溃似乎并没有移除成功,我不知道为什么,每个人都可以帮助我

@interface SYDiagnoseFloatingView()

@property (nonatomic, strong) UIImageView *imageView;

@property (nonatomic, strong) NSMutableArray<UIScrollView *> *scrollViews;

@end

@implementation SYDiagnoseFloatingView
这是我的代码和崩溃信息。我不知道我的代码出了什么问题,谁能帮我

@interface SYDiagnoseFloatingView()

@property (nonatomic, strong) UIImageView *imageView;

@property (nonatomic, strong) NSMutableArray<UIScrollView *> *scrollViews;

@end

@implementation SYDiagnoseFloatingView
添加观察者

- (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
n内部一致性异常
UITableView类的实例0x108d20600已解除分配,而键值观察员仍在该实例中注册。当前观测信息:()
解析原始
0 CoreFoundation\uuuu异常预处理+124
1 libobjc.A.dylib objc_异常_抛出+56
2 CoreFoundation-[NSException initWithCoder:]
3基金会300
4 CoreFoundation_common_removeAllObjects+188
5核心基金会-[uuuu NSArrayM dealloc]+28
6 SoyongMobile40-[SyDiagnosticFloatingView.cxx_destruct](SyDiagnosticFloatingView.m:19)
7 libobjc.A.dylib 0x000000019203c000+28432
8 libobjc.A.dylib objc_破坏力+92
9 libobjc.A.dylib对象_dispose+28
10 UIKit-[UIResponder dealloc]+156
11 UIKit-[UIView DEALOC]+1676
12 SoyongMobile40-[SyDiagnosticFloatingView解除锁定](SyDiagnosticFloatingView.m:0)
13 CoreFoundation_common_removeAllObjects+188
14核心基金会-[uuuu NSArrayM dealloc]+28
15 libobjc.A.dylib 0x000000019203c000+139232
16 UIKit-[UIView DEALOC]+1644
17 libobjc.A.dylib 0x000000019203c000+139232
18 UIKit-[UIView DEALOC]+1644
19 libobjc.A.dylib 0x000000019203c000+139232
20 UIKit-[UIView DEALOC]+1644
21 UIKit-[UINavigationTransitionView解除锁定]+100
22 libobjc.A.dylib 0x000000019203c000+139232
23 UIKit-[UIView DEALOC]+1644
24 UIKit-[UILayoutContainerView解除锁定]+64
25 libobjc.A.dylib 0x000000019203c000+139232
26 UIKit-[UIView DEALOC]+1644
27 libobjc.A.dylib 0x000000019203c000+139232
28 CoreFoundation\u CFAutoreleasePoolPop+28
29 CoreFoundation\uuuuuuuuuuuuucfrunlooprun+1668
30核心基础CFRUNLOOPSCRUN+444
31图形服务GSEventRunModal+180
32 UIKit-[UIApplication\u run]+684
33 UIKit UIApplicationMain+208
34 Soyongmobile40干管(干管长度:16)
35 libdyld.dylib_start+4


我认为您添加了两次相同的观察者。始终调用
[scrollView removeObserver:self-forKeyPath:keypath上下文:nil]
[scrollView addObserver:self-forKeyPath:keypath选项:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld上下文:nil]之前

我认为您添加了两次相同的观察者。始终调用
[scrollView removeObserver:self-forKeyPath:keypath上下文:nil]
[scrollView addObserver:self-forKeyPath:keypath选项:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld上下文:nil]之前

如何添加观察者?我已将代码添加到问题中,请查看您在主线程调用中调用
addFloatingTargetView:
?但可能调用两次。您是否尝试过我的答案中的代码?如何添加观察者?我已将代码添加到问题中。请查看您在主线程调用中调用
addFloatingTargetView:
?但可能调用了两次。你试过我的答案中的代码了吗?是的,谢谢,另一个管理者仍然对scrollView进行KVO,但另一个管理者很弱scrollView@Chendichuan现在你没有例外了,对吧?是的,谢谢you@Chendichuan别忘了接受有用的答案。是的,谢谢,另一位经理仍然在浏览scrollView,但另一个管理薄弱环节scrollView@Chendichuan现在你没有例外了,对吧?是的,谢谢you@Chendichuan别忘了接受有用的答案。