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]を呼んでくれません。

なんでか!