Сбой наблюдателя КВО на iOS 11 - PullRequest
0 голосов
/ 28 мая 2018

У меня есть приложение в App Store, которое отлично работало на iOS 10. Но в последнее время я получаю много отчетов о сбоях, и все журналы указывают на сбой KVO, и все они происходят на iOS 11, ниже приведен журнал сбоев.

Crashed: com.apple.main-thread
0  libobjc.A.dylib                0x181e7a858 object_isClass + 16
1  Foundation                     0x1836d72bc KVO_IS_RETAINING_ALL_OBSERVERS_OF_THIS_OBJECT_IF_IT_CRASHES_AN_OBSERVER_WAS_OVERRELEASED_OR_SMASHED + 68
2  Foundation                     0x1836d5ad0 NSKeyValueWillChangeWithPerThreadPendingNotifications + 300
3  QuartzCore                     0x186e35024 -[CALayer setDelegate:] + 108
4  UIKit                          0x18c866698 -[UIView dealloc] + 708
5  UIKit                          0x18c93f08c -[UILabel dealloc] + 192
6  libobjc.A.dylib                0x181e9a13c (anonymous namespace)::AutoreleasePoolPage::pop(void*) + 844
7  UIKit                          0x18c86678c -[UIView dealloc] + 952
8  CoreFoundation                 0x182b911b4 -[__NSArrayM dealloc] + 140
9  libobjc.A.dylib                0x181e9a13c (anonymous namespace)::AutoreleasePoolPage::pop(void*) + 844
10 UIKit                          0x18c86678c -[UIView dealloc] + 952
11 libobjc.A.dylib                0x181e9a13c (anonymous namespace)::AutoreleasePoolPage::pop(void*) + 844
12 UIKit                          0x18c86678c -[UIView dealloc] + 952
13 libobjc.A.dylib                0x181e9a13c (anonymous namespace)::AutoreleasePoolPage::pop(void*) + 844
14 UIKit                          0x18c86678c -[UIView dealloc] + 952
15 UIKit                          0x18cbd3248 -[UINavigationTransitionView dealloc] + 96
16 libobjc.A.dylib                0x181e9a13c (anonymous namespace)::AutoreleasePoolPage::pop(void*) + 844
17 UIKit                          0x18c86678c -[UIView dealloc] + 952
18 UIKit                          0x18cbd319c -[UILayoutContainerView dealloc] + 60
19 libobjc.A.dylib                0x181e9a13c (anonymous namespace)::AutoreleasePoolPage::pop(void*) + 844
20 CoreFoundation                 0x182b88aac _CFAutoreleasePoolPop + 28
21 UIKit                          0x18cc705fc _prepareForCAFlush + 132
22 UIKit                          0x18cb555b8 _afterCACommitHandler + 236
23 CoreFoundation                 0x182c6a910 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 32
24 CoreFoundation                 0x182c68238 __CFRunLoopDoObservers + 412
25 CoreFoundation                 0x182c68884 __CFRunLoopRun + 1436
26 CoreFoundation                 0x182b88da8 CFRunLoopRunSpecific + 552
27 GraphicsServices               0x184b6b020 GSEventRunModal + 100
28 UIKit                          0x18cb6978c UIApplicationMain + 236
29 MyApp                      0x1009bf748 main (main.m:14)
30 libdyld.dylib                  0x182619fc0 start + 4

Сбои перевалили за 200 сбоев, и все они - одни и те же журналы.Я не смог воспроизвести этот сбой и застрял на том, как действовать дальше.Весь мой проект написан на target-C, и когда я проверил, есть только один метод, в котором я использую KVO.Ниже приведена модель моего метода о том, как я его использовал.

-(void)loadData
{
 //Some code
if (myAlerts) {
        [myAlerts removeObserver:self forKeyPath:@“liveAlerts"];
    }
    myAlerts = myModel.alerts;
    [myAlerts addObserver:self forKeyPath:@"liveAlerts" options:NSKeyValueObservingOptionInitial context:NULL];
}

To remove I use the cleanup method in other viewcontrollers when I no longer need it


-(void)cleanup
{

//Some code

[myAlerts removeObserver:self forKeyPath:@"liveAlerts"];
 myAlerts = nil;

}

Все остальные наблюдатели, которые я добавил в свой проект, являются наблюдателями NSNotificationCenter, может ли это вызвать такой тип журнала аварий?1007 *

...