1

本当に奇妙なバグを追跡するのに1日を費やしました。コードでは過剰リリースはありませんでしたが、それは過剰リリースされたUILabelでした。ラベルのリリースをコメントアウトした場合、コードは問題ありませんでした。

バックグラウンドスレッドでリリースされていたUIViewまで追跡しました。メインスレッドからすべてのUI要素にアクセスすることになっているため、これは正しくないように見えました。次に、以下を使用してバックグラウンドスレッドにロードされているnibファイルを見つけました。

[[NSBundle mainBundle] loadNibNamed:@"nib name" owner:self options:nil];

コードが何をしていたかについて詳しく説明する必要はありませんが、私の質問は次のとおりです。

loadNibNamedがバックグラウンドスレッドで呼び出され、ロードされたビューがペン先ロードプロセスによってキャッシュされる場合、メインスレッドはそのペン先もロードする必要がありますが、キャッシュからロードします。オブジェクトが解放されると、バックグラウンドのペン先から読み込まれたビューもバックグラウンドで解放されますか?とにかくバックグラウンドスレッドが存在しなくなるため、実際には意味がありません。

わかりませんが、GCDディスパッチのコードのloadNibNamed部分をメインスレッドに同期的にラップすることで解決しました。

4

2 に答える 2

3

マイクアッシュの記事から

危険なココアコール

NSBundleこれにはNSHostの問題の半分があります。NSBundleは共有オブジェクトを返しますが、スレッドセーフではないため、メインスレッドのみです。メインスレッドから使​​用しても安全です。私が危険だとマークした理由は、セカンダリスレッドからの使用が安全ではないという事実は実際には文書化されていないためですが、スレッドセーフではないという事実とインスタンスが共有されているという事実から推測する必要があります。他のスレッドからそれを使用したくなる。

于 2012-03-13T00:05:24.173 に答える
2

UI関連のすべての操作は、メインスレッドから実行する必要があります。

于 2012-02-13T17:23:38.440 に答える