首页 > 解决方案 > 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 方法中怎么会发生这种崩溃。

标签: iosobjective-cxcodenssetnsrangeexception

解决方案


现在,我通过将 NSMutableOrderedSet 转换为 NSMutableArray 来消除崩溃。我对其进行了测试,通过将其转换为 NSMutableOrderedSet,我可以在我的测试环境中轻松地将其崩溃。当类型为 NSMutableArray 时,它不会崩溃。我认为这是与 iOS 13 相关的错误。


推荐阅读