为什么在 for() 行上出现 EXC_CRASH (SIGABRT) 错误

Why do I get a EXC_CRASH (SIGABRT) error on a for() line

我收到了一个我一直在使用的应用程序的错误日志,该应用程序遇到间歇性崩溃,通常是在工作 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) {

如果行号可信

而且我不知道这里可能出了什么问题。

Subscribers在class

的init中初始化
_subscribers = [NSMutableArray new];

此后永远不会设置为零。

通过此方法将听众添加到 _subscribers

- (void)subscribe:(id<OnlineStatusSubscriber>)subscriber {
    [_subscribers addObject:subscriber];
}

并且每个调用该方法的 class 确实使用 OnlineStatusSubscriber 接口并实现 onlineStatus:statusChangedTo: 方法。

我已将错误日志添加到 pastebin:https://pastebin.com/Ux0XRm15

以及有问题的 class:https://pastebin.com/NjGcaNxp(违规行是第 73 行)

没关系。我不知何故错过了我正在取消订阅 onlineStatus:statusChangedTo: 电话之一。它甚至不是多线程,只是一条直接路径。好傻

问题已通过遍历 [_subscribers copy] 而不是 _subscribers 得到解决。