2010-07-26 109 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