2009-08-16 13 views
9

インスタンスを割り当てて、内部的に保持している他のものに割り当てられた直後に解放するケースがたくさんあります。例えば自動リリースまたは直後にリリースする方が良いですか?

 
UIView *view = [[UIView alloc] initWithFrame...]; 
[self addSubView:view]; 
[view release]; 

私たちは右の後に自動解放ではなく、リリースと一緒に行くことを示唆している人を聞いたことがあります。

したがって、上記のようになります。

 
UIView *view = [[[UIView alloc] initWithFrame...] autorelease]; 
[self addSubView:view]; 

ここでのベストプラクティスは何ですか?長所と短所?

答えて

14

ほとんどの場合、いずれにしても大したことはありません。 -autoreleaseは、実行ループの現在の反復の終わりにオブジェクトが解放されることを単に意味するので、オブジェクトはどちらの方法でも解放されます。

-autoreleaseを使用する最大の利点は、メソッドのコンテキストでオブジェクトの存続時間を心配する必要がないことです。だから、最後に使用した後に何行かオブジェクトを使って何かをしたいと思ったら、-releaseへの呼び出しを心配する必要はありません。

メインインスタンス-releaseを使用して、あなたの方法で一時オブジェクトのたくさんを作成している場合-autoreleaseを使用して対顕著な違いがあるでしょう。

この方法が終了する頃には
- (void)someMethod { 
    NSUInteger i = 0; 
    while (i < 100000) { 
     id tempObject = [[[SomeClass alloc] init] autorelease]; 

     // Do something with tempObject 

     i++; 
    } 
} 

は、あなたが100,000のオブジェクトが解放されるのを待っている自動解放プールに座って持っている:たとえば、次のような方法を検討してください。 tempObjectのクラスに応じて、これはデスクトップ上の大きな問題であるかもしれないし、そうでないかもしれないが、メモリが制約されているiPhoneで最も確実であろう。したがって、多くの一時オブジェクトを割り当てる場合は、実際によりも-releaseを使用する必要があります。しかし、多くの/ほとんどの用途では、2つの間に大きな違いはありません。

+3

+1。 autoreleaseはパフォーマンス(一般的でないノン・ループ・コードの数字でバックアップされたことはめったにありませんでした)で多くの浮き沈みを得ますが、コードがリファクタリングされたときにも多くのリークが保存されます。低レベルのルーチンでは、より高いレベルで大きなループで呼び出されるかどうかわからないので、より頻繁にリリースを使用します。しかし、releaseを使うつもりならば、変数がまだスコープ内にあれば、すぐに変数をnilに設定しなければなりません。オブジェクトを解放しないでくださいが、それにポインタはあります。 –

5

私はMatt Ballに同意します。

次のように使用することができます
@interface UIView (MyCategories) 
- (UIView *)addNewSubviewOfType:(Class)viewType inFrame:(NSRect)frame; 
@end 

@implementation UIView (MyCategories) 
- (UIView *)addNewSubviewOfType:(Class)viewType inFrame:(NSRect)frame 
{ 
    UIView * newView = [[viewType alloc] initWithFrame:frame]; 
    [self addSubView:newView]; 
    return [newView autorelease]; 
} 
@end 

:あなたが頻繁にこのパターンを使用して自分自身を見つけた場合、迅速なカテゴリを書くことが便利なことができ、私はちょうどそれを追加してみましょう

UIView * view = [someView addNewSubviewOfType:[UIView class] 
             inFrame:someFrame]; 

そして、それにも作品限り、彼らはUIViewの由来しているように、他のタイプの、と:

UIButton * button = [mainView addNewSubviewOfType:[UIButton class] 
              inFrame:buttonFrame]; 
4

私は通常-releaseのために行くのではなく、可能な限り-autorelease。これは長年の経験から、他の人のObjective-Cコードをデバッグし、強化したものです。どこでもautoreleaseを使用するコードは、余分なリリースが間違ったコードから遠く離れて発生するため、オブジェクトが過剰にリリースされたときにデバッグするのが難しくなります。

カカオのメモリ管理のしくみを理解していない人もいます。ルールを学び、APIを学び、オブジェクトを自動リリースする必要はほとんどありません。

最後の副次的な点は、自動解放動作が不要な場合は、autoreleaseを使用して、不要な作業をプログラムに追加するだけです。

関連する問題