2012-03-21 72 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”自动合成伊娃。