ios - NSMutableOrderedSet lastObject NSRangeException 崩溃
问题描述
平均而言,我有一个 NSMutableOrderedSet,其中每秒添加一个新的自定义对象。每次有新数据到达时,都会更新对lastObject的引用。同样在方法结束时,如果 NSMutableOrderedSet 计数大于 300,则从 NSMutableOrderedSet 中删除第一个对象。全部在@synchronized块中完成。
在 iOS13 中,我们在 50.000 个会话中遇到 NSRangeException 崩溃。崩溃日志:
Fatal Exception: NSRangeException
*** -[__NSArrayM objectAtIndex:]: index 300 beyond bounds [0 .. 299]
0 CoreFoundation __exceptionPreprocess
1 libobjc.A.dylib objc_exception_throw
2 CoreFoundation -[__NSCFString characterAtIndex:].cold.1
3 CoreFoundation _CFDataInit
4 xxxxxx -[xxx lastObject:]
通过减少添加数据的时间间隔,我能够在测试环境中创建崩溃。崩溃恰好发生在这一行
MY-NSMutableOrderedSet lastObject
在返回数组中最后一个对象的简单 iOS 方法中怎么会发生这种崩溃。
解决方案
现在,我通过将 NSMutableOrderedSet 转换为 NSMutableArray 来消除崩溃。我对其进行了测试,通过将其转换为 NSMutableOrderedSet,我可以在我的测试环境中轻松地将其崩溃。当类型为 NSMutableArray 时,它不会崩溃。我认为这是与 iOS 13 相关的错误。
推荐阅读
- oracle - 这个使用 NOT EXISTS 的双重子查询实际上返回了什么?
- java - 创建 ObjectInputStream 对象时程序停止
- java - 有没有办法控制用户在 Java 中使用 do 提供的字符串?
- html - 电子邮件 HTML 边框覆盖内容,而不是单元格?
- windows-7 - 使用 7zip (7zS.sfx) 创建的 SFX 存档触发程序兼容性助手
- java - 是否可以以简单的方式使用 PHP POS 与 JavaPOS 设备进行交互?
- javascript - Ember 3.6 超级出租教程 LEAFLET_MAPS_API_KEY 使用 environment.js
- sql - 优化插入选择查询Oracle
- git - 将 master 分支中未提交的更改移动到 dev 分支并恢复 master
- android - 在 CDATA 中包装复数项目时出现 Lint 错误“ImpliedQuantity”