2010-02-15 112 views
3

我有類似的東西。這是內存泄漏嗎?

initMyclass { 
if (self= [super init]) { 
    classMember = [[NSMutableArray alloc] init]; 
} 
return self; 
} 

儀器在那裏報告泄漏。

我在那裏泄漏內存? 如果不是,xcode報告錯誤的內存泄漏?

謝謝。

+0

爲什麼這個問題被低估? –

回答

5

儀器正在報告泄漏,因爲您沒有在其他地方釋放對象。你需要有[classMember release]在類的dealloc方法:

- (void) dealloc { 
    [classMember release]; 
    [super dealloc]; 
} 
+0

我做過了,但儀器仍然報告泄漏。 –

+0

@José - 也許你的'myClass'對象本身永遠不會被釋放? –

+2

然後你將它保留在別的地方。 – bbum

-2

它是一個實例會員?告訴我們這個課程的@interface

另外,initMyClass ..或其他..不是一個適當的init方法。它的簽名應該是這樣的形式:

- (id) init { 
    if ((self = [super init]) != nil) { 
     someInstanceVariable = [NSMutableArray new]; 
    } 
    return self; 
} 

當你在這裏問一個問題時更具體。

+0

@interface myClass:NSObject NSMutableArray * classMember; } –

+0

代碼非常短而簡單,它怎麼能更具體?!我試圖理解爲什麼儀器認爲它是內存泄漏,當它不是。 –

+0

@St3fan除了在方法選擇器之前缺少' - (id)'之外,他的init方法非常好。 –

1

這就是爲什麼你應該使用屬性或顯式訪問器。

如果你有這樣的:

@interface myObject : NSObject 
{ 
    NSMutableArray *classMembers; 
} 
@property(nonatomic, retain) NSMutableArray *classMembers; 

@end 

@implementation myObject 
@synthesize classMembers; 

-(id) init{ 
    if (self=[super init]) { 
     self.classMembers=[[NSMutableArray alloc] initWithCapacity:1]; 
    } 
    return self; 
}//-------------------------------------(id) init------------------------------------ 

-(void) dealloc{ 
    [classMembers release]; 
    [super dealloc]; 
}//-------------------------------------(void) dealloc------------------------------------ 

@end 

你不會(也不應該永遠)都錯過身邊與屬性的保留。這消除了所有泄漏和特性的過度釋放。

如果屬性的對象發生泄漏,那麼您會自動知道它將被保留在另一個對象中,而不是包含該屬性的類的實例。

+0

這段代碼實際上會泄漏。 initWithCapacity:返回一個保留的對象,然後在設置屬性時再次保留該對象。你應該在創建數組時添加autorelease,或者使用[NSMutableArray arrayWithCapacity:1],它將返回一個自動釋放對象。 – Felixyz