首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ivar和解除分配中的财产释放

ivar和解除分配中的财产释放
EN

Stack Overflow用户
提问于 2012-03-21 18:08:18
回答 1查看 1.2K关注 0票数 1

如果我声明一个不带属性声明的ivar,并且这个ivar可以在对象生命周期中使用或不使用,我是否必须在dealloc中释放它?

我有时会看到属性被声明为ivar和property,而有时只有属性声明。有什么关系?哪种方法更好?

示例:

代码语言:javascript
复制
@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声明有时会被省略?

另一种情况是没有属性声明:

代码语言:javascript
复制
@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];
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-03-21 18:33:34

是的,你必须释放它。当您调用[ivar release]时,如果ivar为nil,则不会发生任何事情,但如果它包含指向对象的指针,则不释放它会导致内存泄漏。

最好不要在dealloc方法中使用self.ivar = nil,因为setter方法可能包含释放期间不必要的逻辑,甚至可能导致棘手的bug。

对于没有显式ivar声明的@property声明,"modern runtime“会自动合成ivar。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9802350

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档