6

保持/解放の問題があります。私のビューはかなり複雑なので、NSZombieEnabled を YES に設定し、正確にどのオブジェクトが私に悲しみを引き起こしているかを突き止めようとしています。このプロセスをスピードアップするために、ゾンビが掘り出した墓に戻るためのヒントやトリックがあるかどうか疑問に思っています (申し訳ありませんが、そうしなければなりませんでした)、または関連するオブジェクトに戻りますか? 不可解なコンソール メッセージは、多くの洞察を提供していないようです。

NSInvocation: warning: object 0x1076850 of class '_NSZombie_CALayer' does not implement methodSignatureForSelector: -- trouble ahead

「トラブルアヘッド」と呼ばれるセレクターはありません。

編集- スタック トレースを含む:

#0  0x3026e017 in ___forwarding___
#1  0x3024a0a2 in __forwarding_prep_0___
#2  0x302042e8 in CFRelease
#3  0x00c4fc31 in CALayerUpdateSublayers
#4  0x00c4e173 in -[CALayer dealloc]
#5  0x00c4000e in CALayerRelease
#6  0x00c48dad in CALayerFreeTransaction
#7  0x00c410b8 in CA::Transaction::commit
#8  0x00c492e0 in CA::Transaction::observer_callback
#9  0x30245c32 in __CFRunLoopDoObservers
#10 0x3024503f in CFRunLoopRunSpecific
#11 0x30244628 in CFRunLoopRunInMode
#12 0x32044c31 in GSEventRunModal
#13 0x32044cf6 in GSEventRun
#14 0x309021ee in UIApplicationMain
#15 0x00001eb4 in main at main.m:14

編集 2: ObjectAlloc

ObjectAlloc で問題のメモリ アドレスを調べると、次の 2 つの一致が見つかりました。

#    Address     Category           Creation Time      Size Responsible Library Responsible Caller
0   0x1076980   GeneralBlock-48    00:11.470       48      QuartzCore  -[CALayer setDelegate:]
1   0x1076980   CALayer            00:11.552       48      UIKit       -[UIView _createLayerWithFrame:]

#0 GeneralBlock-48 を掘り下げる:

#   Category        Event Type  Timestamp   Address Size    Responsible Library Responsible Caller
0   GeneralBlock-48 Malloc      00:11.470   0x1076980   48  QuartzCore  -[CALayer setDelegate:]
1   GeneralBlock-48 Free        00:11.551   0x1076980   -48 QuartzCore  -[CALayer addAnimation:forKey:]
2   CALayer         Malloc      00:11.552   0x1076980   48  UIKit   -[UIView _createLayerWithFrame:]

#1 CALayerを掘り下げる:

#   Category        Event Type  Timestamp   Address    Size Responsible Library Responsible Caller
0   GeneralBlock-48 Malloc      00:11.470   0x1076980   48  QuartzCore  -[CALayer setDelegate:]
1   GeneralBlock-48 Free        00:11.551   0x1076980   -48 QuartzCore  -[CALayer addAnimation:forKey:]
2   CALayer         Malloc      00:11.552   0x1076980   48  UIKit   -[UIView _createLayerWithFrame:]

さて、#0 または #1 のいずれかを深く掘り下げると、まったく同じ情報が明らかになることがわかりました。これでトラブルシューティングが半分になると思いますが、まだ途方に暮れています...

4

3 に答える 3

6

バックトレースは、ゾンビがメッセージを送信されているポイントにすぎないと思います。通常、このバックトレースでは、クラッシュの原因に関する情報はまったく得られません。ほとんどの場合、過剰に解放されているオブジェクトのタイプとアドレスしかわかりません。

このようなオーバーリリースを追跡するためによく使用する手法は、Instruments の ObjectAlloc を使用してすべての保持とリリースを追跡することです。ObjectAlloc で過剰に解放されたオブジェクトのアドレスを検索し、すべての保持/解放呼び出しを一覧表示してから、各保持と解放のバランスを取ります。一致する保持のないリリースを見つけたら、問題が見つかりました。

于 2009-07-29T18:23:43.140 に答える
2

簡単にできることの1つは、にシンボリックブレークポイントを設定することですobjc_exception_throw。これにより、例外がスローされるたびにプログラムが一時停止します。これは、あなたに悲しみを与えているものを正確に追跡するのに役立たないかもしれませんCALayerが、それが呼ばれている一般的な周辺を見つけるのに役立つはずです。

于 2009-07-29T13:43:03.160 に答える
2

「トラブルアヘッド」は、セレクターではなく、警告の一部です。警告自体は NSInvocation によるものですが、「class _NSZombie_CALayer」と記載されているということは、割り当てが解除された CALayer で何かが機能しようとしていることを意味します。

スタック トレースは、レイヤーがそのサブレイヤーを解放しようとしているときにこれが発生していることを示しています。

全体として、これは、リリースされているレイヤーに、コードのどこかで過剰にリリースされたサブレイヤーがあることを意味します。CALayers のメモリ管理を確認するか、Clang Static Analyzerを試してください。

于 2009-07-29T18:56:49.783 に答える