0

UIViewControllerサブビューを追加しようとしていますが、ボタンをクリックして閉じます。私の現在のコードはその仕事をしますが、それがリークするのか、それとも問題を引き起こすのかはわかりません。

最初にサブビューを追加します

-(IBAction)openNewView:(id)sender{
   // start animation
   [UIView beginAnimations:@"CurlUp" context:nil];
   [UIView setAnimationDuration:.3];
   [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
   [UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:self.view cache:YES];

   // add the view
   newViewController* newVC = [[newViewController alloc] initWithNibName:@"newViewController" bundle:[NSBundle mainBundle]];
   [self.view addSubview:newVC.view];

   [UIView commitAnimations]; 
}

次に、newViewController.mにそれを削除する関数があります

-(IBAction)closeNewView:(id)sender{
   // start animation
   [UIView beginAnimations:@"curldown" context:nil];
   [UIView setAnimationDelegate:self];
   [UIView setAnimationDuration:.3];
   [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
   [UIView setAnimationTransition:UIViewAnimationTransitionCurlDown forView:self.view.superview cache:YES];

   // close dialog
   [self.view removeFromSuperview];
   [UIView commitAnimations];

   [self.view release];
}

私が言ったように、これは機能しますが、コードを分析すると、次のようになります。

X行に割り当てられ、「newViewController」に格納されたオブジェクトの潜在的なリーク:

newViewController* newVC = [[newViewController alloc] initWithNibName:@"newViewController" bundle:[NSBundle mainBundle]];

呼び出し元がこの時点で所有していないオブジェクトの参照カウントの誤ったデクリメント[self.view release];

削除時autoreleaseにviewControllerが[self.view release]クラッシュするのではなく(追加後にビューを解放した場合も)、次のようになります。-[FirstViewController PerformSelector:withObject:withObject:]:割り当て解除されたインスタンス0xd21c7e0に送信されたメッセージ

[newVC release]いずれかのviewControllersを呼び出すと、deallocビルドに失敗します。

うまくいけば、私はかなり明白な質問をしていませんが、viewControllersを追加および削除する正しい方法は何ですか?

4

1 に答える 1

0

使用している IOS のバージョンは何ですか? [release] 呼び出しを自分で処理する必要がないように、5.0 を使用している場合は、おそらく ARC に切り替える必要があります。

手動のメモリ管理に固執したい、または固執する必要がある場合: newVC を解放しようとすると dealloc がビルドに失敗する理由は、そのポインターが関数 openNewView にスコープされているためです。クラスのメンバーにすると、リリースできるようになります。

@implementation WhateverItsCalled {
  newViewController *newVC;
}

- ( IBAction ) openNewView: (id)sender {
...
  newVC = [ [ newViewController alloc ] initWithNibNamed:...
}

- ( void ) dealloc {
  [ newVC release ];
}

はい、ARC を使用していない場合は、すべての「alloc」を対応する「release」とペアにする必要があります。

また、私は尋ねなければなりません-なぜあなたはここでView Controllerを使用しているのですか? ビューだけが必要な場合は、[ [ NSBundle mainBundle ] loadNibNamed] を使用して NIB からビューをロードし、ファイルの所有者として [self] をリストします。これにより、すべての参照 (必要なビューを含む) が設定され、余分なビュー コントローラーを (どのように) インスタンス化する必要がなくなります。

于 2012-04-18T17:51:56.940 に答える