如果我声明一个不带属性声明的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];
}发布于 2012-03-21 18:33:34
是的,你必须释放它。当您调用[ivar release]时,如果ivar为nil,则不会发生任何事情,但如果它包含指向对象的指针,则不释放它会导致内存泄漏。
最好不要在dealloc方法中使用self.ivar = nil,因为setter方法可能包含释放期间不必要的逻辑,甚至可能导致棘手的bug。
对于没有显式ivar声明的@property声明,"modern runtime“会自动合成ivar。
https://stackoverflow.com/questions/9802350
复制相似问题