我们的一位测试人员报告了以下崩溃:
0 APP_NAME_WAS_HERE 0x00074892 testflight_backtrace + 158
1 APP_NAME_WAS_HERE 0x000754bc TFSignalHandler + 244
2 libsystem_c.dylib 0x378ea7ec _sigtramp + 48
3 CoreFoundation 0x30ef42e6 CFRelease + 94
4 CoreFoundation 0x30f09a36 -[__NSArrayM removeObjectAtIndex:] + 294
5 CoreFoundation 0x30f4a65e -[NSMutableArray removeObjectsInRange:] + 90
6 APP_NAME_WAS_HERE 0x000570ca -[StoryViewController rewindToChunkIndex:] + 558
7 APP_NAME_WAS_HERE 0x00057396 -[StoryViewController restartChapter] + 22
不幸的是,我们无法重现崩溃——我们只能通过 TestFlight 获取崩溃日志。
我们确实收到了调试日志,以确认确实收到了正在执行的操作removeObjectsInRange
的有效范围。NSMutableArray
(此外,这会引发异常而不是发出信号,对吗?)
我唯一的想法是该对象正在获得双重释放,但我不确定在 ARC 开启的情况下如何实现?
请注意,要删除的对象是UIView
子类,并且在此之前,它们中的一些或全部可能已从其父视图中删除。所以如果他们在这个阶段被释放我不会感到惊讶,我只是不明白为什么会导致它崩溃!
编辑:为了验证它是否是一个过度释放的对象,我人为地尝试过度释放一个对象(CFRelease(__bridge (CFTypeRef) obj)
用于在 ARC 环境中强制释放)以查看它将产生的崩溃日志的类型。不幸的是,它有点不同,所以也许它毕竟不是过度发布?也许是某种涂鸦?
这是明确的过度发布的样子:
Exception Type: EXC_CRASH (SIGABRT)
Exception Codes: 0x00000000, 0x00000000
Crashed Thread: 0
Thread 0 name: Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0 libsystem_kernel.dylib 0x369c732c __pthread_kill + 8
1 libsystem_c.dylib 0x36c20208 pthread_kill + 48
2 libsystem_c.dylib 0x36c19298 abort + 88
3 libsystem_c.dylib 0x36bd437a free + 374
4 libobjc.A.dylib 0x375e4d72 object_dispose + 14
5 CoreFoundation 0x362e9618 -[NSObject dealloc] + 76
6 UIKit 0x310323a8 -[UIView dealloc] + 620
7 libobjc.A.dylib 0x375e416e _objc_rootRelease + 30
8 CoreFoundation 0x362dc2e0 CFRelease + 88
9 APP_NAME_WAS_HERE 0x000cea98 -[StoryViewController rewindToChunkIndex:] (StoryViewController.m:584)
以下是过度发布的崩溃日志的样子: