2011-11-02 48 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