2011-08-12 8 views
0

init、alloc、copy、またはmoveというキーワードを使ってオブジェクトを作成しなければならないと思います。私はこのキーワードを使用しないコードでオブジェクトを作成するかもしれないので、私はそれらを正しくリリースする必要はないと思いますか?オブジェクトがリリースされる時期

UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
[button addTarget:self 
      action:@selector(aMethod:) 
forControlEvents:UIControlEventTouchDown]; 
[button setTitle:@"Hello" forState:UIControlStateNormal]; 
button.frame = CGRectMake(40.0, 200.0, 170.0, 40.0); 
[self.view addSubview:button]; 

私のコードでこれらのキーワードを使用していないので、私はそれを正しくリリースしないでください。そのオブジェクトはいつリリースされますか?私はメモリ管理のものと少し混乱しています。

答えて

3

ここで作成したオブジェクトはUIButtonだけで、buttonWithTypeクラスメソッドを使用しました。それはあなたに自動リリースされたオブジェクトを返すので、解放する必要はありません。

このボタンを後で使用する必要がある場合は、それを保持してリリースする必要があります。このボタンをビューに追加するので、ビューはこのケースではコピーを保持しますので、もう一度気にする必要はありません。

+0

私は一度それを保持したら、後でそれを解放する必要がありますか? (後で使用する必要がある場合に備えて)、2回保持すると2回リリースする必要がありますか? –

+0

修正 - オブジェクトのメモリは、保持カウントがゼロになると解放されます。オブジェクトを保持するたびに、保持カウントがインクリメントされます。オブジェクトを解放するたびに、保持カウントがインクリメントされます。オートレリースされたオブジェクトは、システムが後で自動的に解放するオブジェクトです。あなたがどこかにそれを保持していなければ、保持カウントは1になるので、システムがそれを解放するとすぐに解放されます。 –

+0

あなたはそれを持っている! – mattacular

1

XCode 4を実行している場合は、メモリリークのクイック基本チェックを実行するために '分析'モードを実行することをお勧めします。

1

alloc、copy、new、またはretainを使用して所有権を取得していないものを明示的にリリースする必要はありません。

この場合、簡易メソッド(buttonWithType :)でボタンを作成しています。これにより、自動解放されたUIButtonオブジェクトが返されます。これは、実行ループの最後に自動解放プールがフラッシュされると自動的に解放されます。

ここで心配することはありません。実行時にそれを処理させてください。

1

メモリを管理するNSAutoreleasePoolがあります。あなたは、allocとcopy(allocとinitは通常一緒になります)については正しくありましたが、動かないのです。保持されたオブジェクトを返すもう1つのメソッドは、接頭辞がnewであるメソッドです。 +(id)new;。イベント・ループごとにメモリーを管理するには、スレッドごとに自動解放プールが必要です。

ボタンの実装は、より多くの詳細については、を参照してくださいUsing Autorelease Pools

-(id)buttonWithType:(UIButtonType)type 
{ 
    UIButton *button = [[[UIButton alloc] initSecretlyWithType:type] autorelease]; 
    //Customize button if needed 
    return button; 
} 

て見える場合も方法の例。

関連する問題