2012-03-21 105 views
1

如果我宣佈沒有財產聲明的伊娃,並且這個伊娃可以在物品生命週期中使用或不使用,我是否必須在dealloc伊娃和財產釋放dealloc

我有時看到屬性被聲明爲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]; 
} 

怎麼會伊娃聲明有時省略?

另一種情況是在沒有財產申報:

@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

你應該在第二塊代碼中使用'self.ivar = nil;'而不是直接釋放伊娃。 – 2012-03-21 10:11:04

回答

3

是的,你必須將其釋放。當你打電話給[ivar release]時,如果伊娃是nil,沒有任何反應,但如果它包含一個指向一個對象的指針,你就會因爲不釋放它而導致內存泄漏。

這是優選的方法dealloc使用self.ivar = nil,作爲設定器的方法可以包含邏輯即解除分配過程中不必要的,或甚至可能導致棘手的錯誤。

關於@property聲明沒有明確的伊娃聲明,「modern runtime」自動合成伊娃。

相關問題