2012-02-13 13 views
1

本当に奇妙なバグを追跡していました。 UILabelは上書きされていましたが、コードではそれ以上のリリースはありませんでした。私がラベルのリリースをコメントアウトした場合、コードはうまくいきました。バックグラウンドスレッドでペン先をロード

私はそれをバックグラウンドスレッドでリリースされていたUIViewにトラッキングしました。あなたがメインスレッドからすべてのUI要素にアクセスするはずですが、どちらが正しいかは分かりません。私はコードが何をしていたかの詳細に入る必要はありませんが、私の質問がある

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

:私は、使用してバックグラウンドスレッドでロードされていたのnibファイルを見つけ

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

私は分かりませんが、GCDディスパッチのコードのloadNibNamed部分を同期してラップすることで解決しました。

答えて

2

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

+0

はい、私は私の質問でそれを引用しました。私の質問は、他のスレッドでのペン先の読み込みと、キャッシュされたオブジェクトがスレッド間で共有されることです。 – bandejapaisa

3

マイク・アッシュの記事

Dangerous Cocoa Calls

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

関連する問題