2010-07-26 110 views
1

我想澄清一下在这段代码中是否有内存泄漏?据我感觉它在那里。客观C内存泄漏

在.m文件

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

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

回答

0

.h文件中

@interface MyClass{ 
    NSMutableArray *dataArray;  
} 

@property(nonatomic,retain) NSMutableArray *dataArray; 

采取self.的,因为这些都是充当吸气剂,它不像Java或其他语言。否则它看起来很好。

+0

为什么向下票呢?通常认为不是在init和dealloc中使用属性访问器,而是使用ivars的好习惯。 – JeremyP 2010-07-26 15:21:54

+0

是的,但是这个答案没有说明或解释为什么要删除“自我”。修复内存泄漏(“这不是Java”不是答案:-)。 [和不,我没有downvote] – 2010-07-26 15:37:25

2

是的,那里有泄漏。

应该是

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

由于dataArray中被定义为retain属性,在赋值的左手侧使用self.dataArray意味着保持在右手侧。

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

+0

Yechh。为什么不只是'self.dataArray = [NSMutableArray数组];'?要么做,否则,'dataArray = [[NSMutableArray alloc] init];'。注意表达式'self.dataArray = x'被编译器翻译成'[self setDataArray:x]'。 – jlehr 2010-07-26 17:12:52

2

是的,init中有泄漏。 dataArray是用retain属性声明的。所以它保留了给定的数组。但是,既然你分配了它,你就拥有了它,然后你必须在之后释放它。

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

应该是这样的:

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

-(void) dealloc { 
    self.dataArray = nil; 
    [super dealloc]; 
} 
+0

您好nils, 为什么不释放deallc方法中的dataArray?这是必须的。 – 2010-07-26 15:25:18

+0

由于它是一个保留属性,setter将释放旧值。 – nils 2010-07-26 15:31:14

+0

'[self.dataArray release]'“释放一个你不拥有的对象”?在dealloc中这是一个很常见的成语 - 释放你保留的所有iVar。你可以争辩说,通过'self.dataArray = nil'使用setter是更好的风格(因为它消除了对释放对象的引用),但效果是相同的。 – 2010-07-26 15:31:15