2011-11-02 47 views
0

使用的XCode 4.2,我使用的代碼靜態分析類似如下的內存泄漏:的XCode靜態分析報告,當實例變量被分配

@interface ArrayDimensions: NSObject 
{ 
    ArrayIndex *dims; 
} 
-(id) init: (int *)dims_; 
@end 

@implementation ArrayDimensions 

-(id) init: (int *)dims_ 
{ 
    self = [super init]; 
    if(self) 
     dims = [[ArrayIndex alloc] make:dims_]; 
    return self; 
} 
@end 

靜態分析報道稱,該「方法返回帶+1保留計數「,並且」對象泄漏:已分配的對象在此執行路徑中未被引用「。在我的代碼中這是一種常見的警告類型,並且在每種情況下,分析器似乎都無法識別出我正在設置實例變量的值。

我的問題是,我是否確實泄漏內存或分析儀是否有問題。

回答

3

分析器期望方法返回一個autoreleased對象,除非它們是一個alloc/init對或在名稱具有copy,按照Objective-C的方法命名的準則。嘗試將您的初始化方法的名稱從make:更改爲initWithDimensions:並查看是否擺脫了警告。

0

您需要在dealloc方法中釋放ArrayIndex。在alloc之後調用一個不以init開頭的方法是不鼓勵的,這是一種不好的做法,可能會讓靜態分析器感到困惑。

這是您需要添加到您的ArrayDimensions實施,以防止實際泄漏。

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

我想說的是我在dealloc方法中釋放成員。在我看到這個問題的情況下,分析儀似乎不在乎。爲什麼這是一個「壞習慣」? –

+0

無論何時在Objective-C中分配一個對象,它都會緊跟着一些'init'的變體。如果您要將'ArrayIndex'頭文件放在另一個Objective-C程序員的指令中,我可以保證他們會錯誤地實例化對象。就像mipadi說的那樣,如果'make'是你的初始化器,就把它重命名爲'initWithDimensions'。這可能會阻止靜態分析儀投訴。 – Joe