在dealloc发布的ivar和财产

时间:2012-03-21 10:08:18

标签: objective-c memory-management properties

如果我声明没有属性声明的ivar,并且在对象生命周期中可以使用或不使用此ivar,我是否必须在dealloc中发布它?

我有时会看到属性被声明为ivar和property,有时只有属性声明。有什么不同?哪种方式更好?

示例:

@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 个答案:

答案 0 :(得分:3)

是的,你必须释放它。当你调用[ivar release]时,如果ivar是nil没有任何反应,但是如果它包含指向对象的指针,则会因为不释放而导致内存泄漏。

最好self.ivar = nil方法中使用dealloc,因为setter方法可能包含在重新分配期间不必要的逻辑,或者甚至可能导致棘手的错误。 / p>

关于没有明确的ivar声明的@property声明,“modern runtime”会自动合成ivar。