通常、xib からカスタム ビューをロードするコードは次のようになります。
@implemenation MyCustomView
- (id)init
{
[self release];
if ((self = [[NSBundle loadViewFromXibName:@"MyCustomView" withClass:[MyCustomView class] owner:nil] retain]))
{
//some init here
}
return self;
}
where [NSBundle loadViewFromXibName:withClass:owner:]
- xib からロードされた atoreleased ビューを返します。
そして、すべて正常に動作しています。しかし、ARC と同等のコードで書き込もうとすると、次のようになります。
@implemenation MyCustomView
- (id)init
{
if ((self = [NSBundle loadViewFromXibName:@"MyCustomView" withClass:[MyCustomView class] owner:nil]))
{
//some init here
}
return self;
}
EX_BAD_ACCESS でアプリがクラッシュする (解放メッセージが割り当て解除されたインスタンスに送信される) この場合はどうなりますか? そして、どうすればこの問題を解決できますか?
更新この問題は、iOS6 SDK (iOS6 シミュレーター) でのみ発生します。iOS5 SDK および iOS 5 デバイス/シミュレーターでは、すべて問題ありません。
更新この問題は、テーブル ビューのライフサイクルで割り当てが解除されたテーブル ビュー セルでのみ発生します。スタティック セル ビルダー (xib からロードされたセルを返すもの) を実装し、内部セルの初期化を awakeFromNib に移動しました。現在、すべて正常に動作しています。
なぜこの問題が発生するのか理解できません - 「自己」は __strong であり、それに任意のオブジェクトを割り当てた場合、自動解放できません。私は間違っていますか?