2012-03-21 9 views
1

プロパティ宣言なしでivarを宣言し、このivarをオブジェクトのライフサイクルで使用するかどうかを指定すると、deallocにリリースする必要がありますか?deallocのivarとプロパティのリリース

私はときどき、プロパティがivarとプロパティとして宣言されていることがあります。プロパティ宣言だけを持つこともあります。違いはなんですか?どちらが良い方法ですか?

例:

@interface MyClass: NSObject 
{ 
    NSObject *ivar; // This is sometimes omitted. 
} 

@property (nonatomic, retain) NSObject *ivar; 

@implementation MyClass 
@synthesize ivar; 

... 

-(void)dealloc 
{ 
    [ivar release]; 
    [super dealloc]; 
} 

IVAR宣言は時々省略されているどのように来ますか?

@interface MyClass: NSObject 
{ 
    NSObject *ivar; 
} 

@implementation MyClass 

-(void)thisMethodCanBeCalledOrNot 
{ 
    ivar = [[NSObject alloc] init]; 

    [ivar useIt]; 

    //ivar must be alive for further uses in different methods of this class. For this is not released in this method. 
} 

... 

-(void)dealloc 
{ 
    [ivar release]; //If thisMethodCanBeCalledOrNot is never called, could this cause a over release in ivar? 
    [super dealloc]; 
} 
+1

ivarを直接リリースするのではなく、コードの2番目のブロックで 'self.ivar = nil;'を使うべきです。 –

答えて

3

はいあなたはそれを解放する必要があります:なしプロパティ宣言がない場合

他のケースです。 [ivar release]を呼び出すと、ivarがnilの場合は何も起こりませんが、オブジェクトへのポインタが含まれている場合は、解放しないとメモリリークが発生します。

これは、setterメソッドが解放時に不要なロジックを含むことができ、あるいはトリッキーなバグを引き起こす可能性があるとして、dealloc方法でself.ivar = nilを使用ないに好適です。

明確なivar宣言のない@property宣言に関しては、「modern runtime」はivarを自動的に合成します。

関連する問題