为啥我在 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() 之后出现在错误的行上?