テスターの 1 人が次のクラッシュを報告しています。
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
サブクラスであり、事前にそれらの一部またはすべてがスーパービューから削除されている可能性があることに注意してください。したがって、この段階でリリースされたとしても驚かないでしょうが、なぜそれが原因でクラッシュするのか理解できません!
編集: 過剰にリリースされたオブジェクトであることを確認するために、(ARC 環境で強制的にリリースするために使用して) オブジェクトを人為的に過剰にリリースしCFRelease(__bridge (CFTypeRef) obj)
て、それが生成するクラッシュ ログのタイプを確認しました。残念ながらちょっと違うので、やっぱりオーバーリリースじゃないのかな?何かの落書きではないでしょうか。
明確な過剰リリースは次のようになります。
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)
過剰リリースのクラッシュ ログは次のようになります。