【问题标题】:Objective C memory leakObjective C 内存泄漏
【发布时间】:2010-07-26 15:10:40
【问题描述】:

我想澄清一下这段代码是否存在内存泄漏?就我感觉它在那里。

在.h文件中

@interface MyClass{
     NSMutableArray *dataArray;    
}

@property(nonatomic,retain) NSMutableArray *dataArray;

在 .m 文件中

-(id) init{    
    self. dataArray = [[NSMutableArray alloc]init];    
}

-(void) dealloc{   
    [self.dataArray release];
    [super dealloc];
}

【问题讨论】:

    标签: iphone objective-c iphone-sdk-3.0 ipad


    【解决方案1】:

    是的,那里有泄漏。

    应该是

    self.dataArray = [[[NSMutableArray alloc] init] autorelease];
    

    由于 dataArray 被定义为 retain 属性,因此在赋值左侧使用 self.dataArray 意味着在右侧使用保留。

    编辑: ...加上之前存储在 self.dataArray 中的对象的释放,在 init 调用时为 nil

    【讨论】:

    • 叶赫。为什么不只是self.dataArray = [NSMutableArray array];?要么这样做,要么,dataArray = [[NSMutableArray alloc] init];。请注意,表达式self.dataArray = x 被编译器翻译成[self setDataArray:x]
    【解决方案2】:

    是的,init 中有泄漏。 dataArray 是用retain 属性声明的。所以它保留给定的数组。但是,由于您分配了它,因此您拥有它,之后您必须释放它。

    dealloc 也不好。此代码在某些情况下可能会崩溃(可能不在此处),因为您释放了不属于您的对象。

    应该是这样的:

    -(id) init {
        NSMutableArray *array = [NSMutableArray new];
        self.dataArray = array;
        [array release];
    }
    
    -(void) dealloc {
        self.dataArray = nil;
        [super dealloc];
    }
    

    【讨论】:

    • 您好,尼尔斯,为什么不在 deallc 方法中释放 dataArray?这是必须的。
    • 因为它是一个保留属性,所以 setter 释放旧值。
    • [self.dataArray release]如何“释放一个你不拥有的对象”?这是 dealloc 中很常见的习语——释放所有你保留的 iVar。你可能会争辩说通过self.dataArray = nil 使用setter 是更好的风格(因为它消除了对释放对象的引用),但效果是一样的。
    • @David Guess 这只是苹果在developer.apple.com/mac/library/documentation/Cocoa/Conceptual/… 中没有很好解释的东西——他们不是在谈论属性/生成的访问器。因此,根据 Apple 的定义,您不拥有分配给属性的对象。
    • 那里缺少几个分号
    【解决方案3】:

    去掉self. 是因为它们充当了getter,它不像Java 或其他语言。否则看起来很好。

    【讨论】:

    • 为什么投反对票?通常认为不使用 init 和 dealloc 中的属性访问器而是使用 ivars 是一种好习惯。
    • 是的,但是这个答案没有说明这一点,也没有解释为什么要删除“自我”。修复内存泄漏(“它不是 Java”不是答案 :-)。 [不,我没有投反对票]
    猜你喜欢
    • 2011-06-07
    • 2011-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-20
    相关资源
    最近更新 更多