我想澄清一下在這段代碼中是否有內存泄漏?據我感覺它在那裏。客觀C內存泄漏
在.m文件
-(id) init{
self. dataArray = [[NSMutableArray alloc]init];
}
-(void) dealloc{
[self.dataArray release];
[super dealloc];
}
我想澄清一下在這段代碼中是否有內存泄漏?據我感覺它在那裏。客觀C內存泄漏
在.m文件
-(id) init{
self. dataArray = [[NSMutableArray alloc]init];
}
-(void) dealloc{
[self.dataArray release];
[super dealloc];
}
.h文件中
@interface MyClass{
NSMutableArray *dataArray;
}
@property(nonatomic,retain) NSMutableArray *dataArray;
採取self.
的,因爲這些都是充當吸氣劑,它不像Java或其他語言。否則它看起來很好。
是的,那裏有泄漏。
應該是
self.dataArray = [[[NSMutableArray alloc] init] autorelease];
由於dataArray中被定義爲retain
屬性,在賦值的左手側使用self.dataArray
意味着保持在右手側。
編輯: ...加上之前已存儲在self.dataArray中的對象的發佈,在init調用時爲nil
。
Yechh。爲什麼不只是'self.dataArray = [NSMutableArray數組];'?要麼做,否則,'dataArray = [[NSMutableArray alloc] init];'。注意表達式'self.dataArray = x'被編譯器翻譯成'[self setDataArray:x]'。 – jlehr 2010-07-26 17:12:52
是的,init中有泄漏。 dataArray是用retain屬性聲明的。所以它保留了給定的數組。但是,既然你分配了它,你就擁有了它,然後你必須在之後釋放它。
另外dealloc不好。在某些情況下(可能不在這裏),此代碼可能會崩潰,因爲您釋放了一個不屬於您的對象。
應該是這樣的:
-(id) init {
NSMutableArray *array = [NSMutableArray new];
self.dataArray = array;
[array release];
}
-(void) dealloc {
self.dataArray = nil;
[super dealloc];
}
您好nils, 爲什麼不釋放deallc方法中的dataArray?這是必須的。 – 2010-07-26 15:25:18
由於它是一個保留屬性,setter將釋放舊值。 – nils 2010-07-26 15:31:14
'[self.dataArray release]'「釋放一個你不擁有的對象」?在dealloc中這是一個很常見的成語 - 釋放你保留的所有iVar。你可以爭辯說,通過'self.dataArray = nil'使用setter是更好的風格(因爲它消除了對釋放對象的引用),但效果是相同的。 – 2010-07-26 15:31:15
爲什麼向下票呢?通常認爲不是在init和dealloc中使用屬性訪問器,而是使用ivars的好習慣。 – JeremyP 2010-07-26 15:21:54
是的,但是這個答案沒有說明或解釋爲什麼要刪除「自我」。修復內存泄漏(「這不是Java」不是答案:-)。 [和不,我沒有downvote] – 2010-07-26 15:37:25