UIViewControllerの罠
最近ちょっとはまった罠を二つ。
deallocでautoreleaseすると変なところでBAD_ACCESSがでる
deallocでアウトレットなViewにnilを代入するとか、やらないといけないことになってるわけですが、これやると微妙な感じになることがあります。
-(void) dealloc { self.myView = nil; [super dealloc]; }
myViewなViewのdelegateとかにselfを入れてると、nilを代入した後に、変なタイミングでdelegateのメソッドを呼ぼうとして、UIViewControllerなdelegateはすでに死んでて、変なところでエラーになったりする。
-(void) dealloc { self.myView.delegate = nil; self.myView = nil; [super dealloc]; }
ちゃんとdelegateもクリアしてあげましょう。
変なところでエラーになる、というのは、autoreleaseしてるからで、releaseにすると良いのかもしれない。けど、まあautorelease使うよね。Weak ref的なやつがあると便利だと思うんだけど。
initWithNibNameはinitを呼ばない
UIViewControllerのサブクラスのテンプレートには、なぜかinitじゃなくてinitWithNibName:bundleのテンプレートがあって、ずっと不思議に思ってた。
-(id) init { self = [super self]; self->array = [[NSMutableArray array] retain]; ... // 中身を入れる return self; } +(HogeViewController*) hogeViewController { HogeViewController* hoge = [[[HogeViewController alloc] initWithNibName:@"hoge" bundle:nil] autorelease]; return hoge; }
これ、動きません。initWithNibNameは、[self init]を呼んでくれません。
なんでか!