2011-02-05 4 views
2

こんにちは私はobj-Cのautorelease関数呼び出しを完全に理解していません。Objective C autorelease

@interface A{ 
id obj; 
} 

@implementation A 

-(void)myMethod; 
{ 
obj = [BaseObj newObj];   //where newObj is a method like :[[[BaseObj alloc]init]autorelease]; 
} 

-(void)anotherMehtod; 
{ 
[obj someMeth];      //this sometimes gives me EXC_BAD_ACCESS 
} 

@end 

これを解決するには、私は保持します。今私はそれを保持する場合、手動でこのオブジェクトを解放する必要がありますか?

+4

@interface A{ id obj; } @implementation A -(void)myMethod { [obj autorelease]; obj = [[BaseObj newObj] retain]; //where newObj is a method like :[[[BaseObj alloc]init]autorelease]; } -(void)anotherMehtod; { [obj someMeth]; //this sometimes gives me EXC_BAD_ACCESS } -(void)dealloc { [obj release]; [super dealloc]; } @end 
サイドノート:ココア内のルールは、メソッド名が 'new'、' copy'、 'retain'、または' alloc'、で始まる場合、発信者が送信しなければならないことですそれをバランスさせるために 'release'または' autorelease'を実行します。したがって、 'newObj'という名前のメソッドは、それ自身の結果を自動解放するべきではありません。 –

答えて

0

はい。あなたがのオブジェクトを保持する場合は、オブジェクトはですが、あなたはまた、それをiOSでリリースすることになります。

4

オブジェクトのオーナーの場合は、それをリリースする責任があります。

次の少なくとも一つやった場合は、オブジェクトの所有者になる:

  • は、詳細は合格retain
  • copy

を通過したalloc

  • を通してそれをインスタンス化します詳細を読むObject Ownership and Disposal

  • +0

    'new'を忘れてしまったので、+ newObjがガイドラインに従えば、オブジェクトは最初に自動リリースされるべきではありません。 –

    +1

    @ Georg Fritzsche: 'new'は' [[aClass alloc] init];と同じです。したがって、 'alloc'はenaughだけです。 descriptionからの '+ newObj'は既に' release' pass: 'alloc 'init' autorelease ''を含んでいますので、ここで 'release'を追加する必要はありません –

    +0

    もちろん' obj'は 'anotherMehtod'ですでにリリースされています。その理由はEXC_BAD_ACCESSの結果です –

    0

    Obj-Cの他の静的メソッドと同様に、このメソッドの最後の-(void)myMethod(大体)objのメソッドにのみ、あなたのメソッドに存在する静的メソッドは、autoreleaseプールからのメッセージ-releaseを取得します。

    このオブジェクトを保存する場合は、[[BaseObj newObj] retain]または[BaseObj alloc] init]を使用し、-deallocにリリースするか、リリースする必要がある場合にリリースします。例えば