2011-02-10 5 views
12

非常に奇妙な問題があります。私はあなたの多くがこれを解決するために私に情報を提供できることを願っています。 アプリケーションがかなり頻繁に中断しますが、正確なシナリオを取得できません。Reg:ファイナライズされているレイヤーを変更しています......... [CALayer frame]:解放されたインスタンスにメッセージが送信されました。0xe43c520

私は私のスタックトレースが続き

2011-02-10 16:22:12.914 RCA-iOS[4132:8327] modifying layer that is being finalized - 0xe43c520 
2011-02-10 16:22:13.253 RCA-iOS[4132:207] modifying layer that is being finalized - 0xe43c520 
2011-02-10 16:22:13.270 RCA-iOS[4132:207] modifying layer that is being finalized - 0xe43c520 
2011-02-10 16:22:13.270 RCA-iOS[4132:207] modifying layer that is being finalized - 0xe43c520 
2011-02-10 16:22:13.272 RCA-iOS[4132:207] *** -[CALayer frame]: message sent to deallocated instance 0xe43c520 

を次取得ログイン

。メインスレッドで壊れます

#0 0x01978057 in ___forwarding___ 
#1 0x01a07b42 in __forwarding_prep_1___ 
#2 0x003c196a in -[UIView(Geometry) frame] 
#3 0x003f5ff4 in -[UINavigationBar _getTitleViewFrame:leftViewFrame:rightViewFrame:forViews:forItemAtIndex:] 
#4 0x003e5cab in -[UINavigationBar _getTitleViewFrame:leftViewFrame:rightViewFrame:forViews:] 
#5 0x003f0c06 in __-[UINavigationBar layoutSubviews]_block_invoke_1 
#6 0x003bdb5c in +[UIView(Animation) _performWithoutAnimation:] 
#7 0x003f76bb in -[UINavigationBar layoutSubviews] 
#8 0x00f59451 in -[CALayer layoutSublayers] 
#9 0x00f5917c in CALayerLayoutIfNeeded 
#10 0x00f5237c in CA::Context::commit_transaction 
#11 0x00f520d0 in CA::Transaction::commit 
#12 0x00f827d5 in CA::Transaction::observer_callback 
#13 0x019e7fbb in __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ 
#14 0x0197d0e7 in __CFRunLoopDoObservers 
#15 0x01945bd7 in __CFRunLoopRun 
#16 0x01945240 in CFRunLoopRunSpecific 
#17 0x01945161 in CFRunLoopRunInMode 
#18 0x02129268 in GSEventRunModal 
#19 0x0212932d in GSEventRun 
#20 0x0039e42e in UIApplicationMain 
#21 0x00001fd0 in main at main.m:14 

NSZombieオブジェクトのInstrumentの出力は次のとおりです。これはUIKitを指します

# Category Event Type RefCt Timestamp Address Size Responsible Library Responsible Caller 
0 CALayer Malloc 1 25304068864 0x10837840 48 UIKit -[UIView _createLayerWithFrame:] 
1 CALayer Zombie -1 99780847872 0x10837840 0 UIKit -[UIView(Geometry) frame] 

コードには何も指摘されていません。誰かがこのような問題に直面していますか?はいの場合は、私に連絡してください。
1) "ファイナライズされているレイヤーの変更"の問題が解決したら、
2)UIViewのレイヤーが原因ですか?たとえば(view.layer.cornerRadius)?
3)トレースポイントがUINAvigationBarにスタックされていますが、メソッドをオーバーライドして何かを試してみる方法はありますか?

何か助けていただければ幸いです。ありがとう

答えて

40

エラー"modifying layer that is being finalized"は、割り当て解除中のCALayerのプロパティを変更しようとしているときに発生します。私は、このレイヤの-deallocメソッドの中で、誤ってアクセサを使用してCALayerのプロパティをクリアしたときにこれが起こったのを見ました。

これは、表示関連のものが更新された場合(つまり、基になるCALayerに触れる場合)、UIViewの-deallocメソッド内で発生することもあります。

あなたの場合は、ゾンビメッセージのためにどこかでUIViewのオーバーリリースがあるようです。 "modifying layer that is being finalized"はそれの副作用です。なぜなら、ある時点で、UIViewが解放される前にUIViewを更新する必要があるからです。

ブレークポイントをオンにし、スローされた例外にブレークポイントを設定して、デバッガ内でアプリケーションを実行してください。オーバーレイされたUIViewにメッセージが送信されている行を停止する必要があります。これは、どのビューがその中心にあるかを示すはずです。それから、あなたがリリースメッセージをあまりにも多く送信している(または現在のスコープを超えてそれを必要としている場合には保持しないでオートレリースした)時点を見つけるためにバックトラックすることができます。

すでにUINavigationBarを参照している証拠があるので、それを適切に保持していることを確認するために、そのチェックと関連するビューを確認してください。

+0

返信いただきありがとうございます。私は30回に一度のようにランダムな時間にこの問題を抱えています。それでも私はバグのシナリオを再現することが非常に難しくなっているので、修正することはできません。私はアプリケーションで多くの非同期スレッドを使用しているので、スレッド化は問題になりますか? – D25

+0

@MegaMind - はい、スレッド化は、このような問題の非常に良い原因となる可能性があります。メインスレッド以外のユーザーインターフェイス要素を更新していないこと、またはバックグラウンドスレッド上のユーザーインターフェイスの変更を間接的に引き起こす可能性のあるアクションを引き起こす可能性があることを確認してください。また、間違ったタイミングで何かを誤ってリリースしている可能性があるので、スレッド間のメモリ管理には非常に注意してください。 –

+0

Yupはスレッドの問題でした。 – D25

0

@ MegaMind-私もこの問題を解決しました。この問題は、アプリケーションを終了させる原因となる「ファイナライズされているレイヤーを修正していますが、この問題を解決できます。私はUIViewが表示されているときに呼び出されている任意のオブジェクトを解放していると思います。

0

呼び出されたallocがないオブジェクトをリリースしたときにこのエラーが発生しました。

0

私のようなnoobs(私のような)を助けるために、彼らのmemと何か間違って見ることができます。私は間違ってIBOutletプロパティに「代入」を使用していたため、このエラーが発生しました。 コピー貼り付けには注意してください!

2

誤ってリリースされてはならないオブジェクトをリリースしようとしたときに、このエラーが発生しました。このエラーは、UIViewアニメーションブロックに使用すると同時に発生します。問題を解決するための修正。

0

UIButtonをクリックしたときにこのエラーが発生しました。面白いことに、UIbuttonでは問題はありませんでしたが、実際にはボタンの下のサブビューの1つにありました。私はそれに加えてリリースを持っているサブビューを見つけました。

関連する問題