【发布时间】:2018-08-14 13:17:29
【问题描述】:
我收到了一条错误日志,说明我一直在开发的应用程序遇到间歇性崩溃,通常是在工作 30 多分钟后。日志中收到的异常属于 EXC_CRASH (SIGABRT) 类型。我自己没有经历过崩溃,也无法访问有问题的设备,所以在尝试复制问题时,我只需要查看日志即可。
符号化日志后,看来罪魁祸首是下面这段代码(错误日志中线程0位置10)
if(oldStatus != _connected) {
for(id<OnlineStatusSubscriber> subscriber in _subscribers) {
[subscriber onlineStatus:self statusChangedTo:_connected];
}
}
具体来说
for(id<OnlineStatusSubscriber> subscriber in _subscribers) {
如果要相信行号。
而且我无法弄清楚这里可能出了什么问题。
订阅者在类的init中初始化
_subscribers = [NSMutableArray new];
此后再也不会设置为零。
侦听器通过此方法添加到 _subscribers
- (void)subscribe:(id<OnlineStatusSubscriber>)subscriber {
[_subscribers addObject:subscriber];
}
每个调用该方法的类都使用 OnlineStatusSubscriber 接口并实现 onlineStatus:statusChangedTo: 方法。
我已将错误日志添加到 pastebin:https://pastebin.com/Ux0XRm15
以及相关类:https://pastebin.com/NjGcaNxp(违规行是第 73 行)
【问题讨论】:
-
会不会是多线程问题?例如。另一个线程在枚举
_subscribers的内容时更改它? -
据我所见。唯一可能改变订阅者的时间是与用户交互有关,并且当用户很长时间没有触摸设备时会发生崩溃。 for 循环代码本身可能会被多个线程调用,但同时迭代应该不会导致问题,对吧?
标签: ios objective-c ipad afnetworking afnetworking-3