0

(^。^)こんにちは、私の英語は上手ではありません。

こんにちは私は次の問題を抱えています私は2つのボタンを作成します最初の1つのボタンは1つのViewControllerを作成し、彼のビューを他のViewControllerに追加します2番目のボタンは作成したView Controllerを解放し、親からビューを削除します。速くタップすると、投稿タイトルのようなメッセージで2つのボタンがクラッシュしますこれはコードです

(これはメモリの問題が原因ですが、何が問題なのですか?? XCODE-PROFIL-INSTRUMENTS-Allocations please Helpを使用したメモリ管理を確認するためにのみこれを行います):

- (IBAction)create:(id)sender{
       vc = nil;
       vc = [[[VC alloc] initWithNibName:@"VC" bundle:[NSBundle mainBundle]] retain];
      [_VW addSubview:vc.view];
}

そして、このボタンで殺します:

- (IBAction)kill:(id)sender{
      [vc.view removeFromSuperview];
      [vc release];
}
4

2 に答える 2

3

ボタンを速く押すと、少なくともキルボタンの場合は、ボタンをrelease何度押しても表示を試みます(ボタンを1回押すだけでコードが機能すると仮定します)。EXC_BAD_ACCESSコードは、すでに解放されているメモリ位置にアクセスしようとしていることを意味します。

これを防ぐ最善の方法は、この[NSButton setEnabled:(BOOL)enabled]方法を使用することです。作成ボタンが押されたら、強制終了ボタンを有効にし、作成ボタンを無効にします。強制終了ボタンが押されたら、強制終了ボタンを無効にし、作成ボタンを有効にします。これにより、偶発的な余分な割り当てやリリースを防ぐことができます。

また、createメソッドでは、の割り当て行retainでその余分な部分を削除する必要があります。自動的に保持カウントを(1に)インクリメントし、その余分な保持により2になります。このように、強制終了ボタンを押すと、オブジェクトは1回解放されますが、保持カウントは1のままで、メモリーリーク。vcalloc

于 2012-04-14T02:32:05.953 に答える
0

これvcはiVarのようですので、メソッドを送信releaseしないでくださいkill:。したがって、コード行を削除するだけです。

[vc release];

それをメソッドに追加しますdealloc


以下のようなコードを使用することをお勧めしますcreate:

if (vc == nil)
  vc = [[[VC alloc] initWithNibName:@"VC" bundle:[NSBundle mainBundle]] retain];
[_VW addSubview:vc.view];

そうしvcないと、nilでない場合に、メモリリークが発生します。

于 2012-04-14T02:50:07.623 に答える