本当に奇妙なバグを追跡するのに1日を費やしました。コードでは過剰リリースはありませんでしたが、それは過剰リリースされたUILabelでした。ラベルのリリースをコメントアウトした場合、コードは問題ありませんでした。
バックグラウンドスレッドでリリースされていたUIViewまで追跡しました。メインスレッドからすべてのUI要素にアクセスすることになっているため、これは正しくないように見えました。次に、以下を使用してバックグラウンドスレッドにロードされているnibファイルを見つけました。
[[NSBundle mainBundle] loadNibNamed:@"nib name" owner:self options:nil];
コードが何をしていたかについて詳しく説明する必要はありませんが、私の質問は次のとおりです。
loadNibNamedがバックグラウンドスレッドで呼び出され、ロードされたビューがペン先ロードプロセスによってキャッシュされる場合、メインスレッドはそのペン先もロードする必要がありますが、キャッシュからロードします。オブジェクトが解放されると、バックグラウンドのペン先から読み込まれたビューもバックグラウンドで解放されますか?とにかくバックグラウンドスレッドが存在しなくなるため、実際には意味がありません。
わかりませんが、GCDディスパッチのコードのloadNibNamed部分をメインスレッドに同期的にラップすることで解決しました。