为啥我在 for() 行上出现 EXC_CRASH (SIGABRT) 错误

Posted

技术标签:

【中文标题】为啥我在 for() 行上出现 EXC_CRASH (SIGABRT) 错误【英文标题】:Why do I get a EXC_CRASH (SIGABRT) error on a for() line为什么我在 for() 行上出现 EXC_CRASH (SIGABRT) 错误 【发布时间】: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 循环代码本身可能会被多个线程调用,但同时迭代应该不会导致问题,对吧? 【参考方案1】:

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

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

【讨论】:

以上是关于为啥我在 for() 行上出现 EXC_CRASH (SIGABRT) 错误的主要内容,如果未能解决你的问题,请参考以下文章

为啥在创建 UIWebView 后清除 NSUserDefaults 会导致 EXC_CRASH?

为啥我的光标在 NextLine() 之后出现在错误的行上?

为啥我在 Unity RayMarching 着色器中出现 for-loop 错误?

为啥 UPDATE 在不相关的行上阻止 SELECT?

为啥 nodejs 在我的 BIT(1) 行上返回笑脸?

为啥我在此代码的循环中出现错误?