内存泄漏,MutableArray中的对象没有被释放?

时间:2011-07-25 08:09:03

标签: ios memory-leaks nsmutablearray retain

Xcode告诉我,在内存泄漏方面,下面的代码存在一些问题。

@property (nonatomic, retain) NSMutableArray *naw_rows;

-(void) loadTableRows:(BOOL)shouldReload
{
    [naw_rows removeAllObjects];

  [self.naw_rows addObject: [[CellModel alloc] initialize:@"name"     title:@"Name"          value: self.currentProfile.name]];
  [self.naw_rows addObject: [[CellModel alloc] initialize:@"company"  title:@"Company name"  value: self.currentProfile.company]];
  [self.naw_rows addObject: [[CellModel alloc] initialize:@"address"  title:@"Address"         value: self.currentProfile.address]];
  [self.naw_rows addObject: [[CellModel alloc] initialize:@"zipcode"  title:@"Zipcode"      value: self.currentProfile.zipcode]];
  [self.naw_rows addObject: [[CellModel alloc] initialize:@"city"     title:@"City"        value: self.currentProfile.city]];
}

// here is my cellModel object:
@implementation CellModel

-(id) initialize:(NSString *)newName title:(NSString *)newTitle value:(NSString *)newValue;
{
    if (self == [super init])
    {
        name = newName;
        title = newTitle;
        value = newValue;
    }
    return self;
}

- (NSString *) getName
{
   return name;
}

- (NSString *) getTitle
{
    return title;
}

- (NSString *) getValue
{
    return value;
}

-(void)dealloc
{
    [super dealloc];
}

@end;

所有addObject行都会出现以下错误:

  

在线分配的对象的潜在泄漏 - Method返回一个   Objective-C对象具有+1保留计数(拥有引用)对象   在线分配 - 以后在此执行路径中不会引用   保留计数为+1(对象泄露)

在关于内存泄漏的其他主题中,我发现这是正确的方法:

CellModel *model = [[CellModel alloc] initialize:@"name" title:@"Name" value: self.currentProfile.name];
[self.naw_rows addObject: model];
[model release];

但是这给了我以下错误:

  

对象的引用计数的不正确减少   此时由来电者拥有

那么我做错了什么?在我的第一段代码中,保留计数应为1.由数组拥有。我假设当我使用[array remodeAllObjects]

时会释放这些对象

提前致谢,

尼科

2 个答案:

答案 0 :(得分:2)

泄漏:

[self.naw_rows addObject: [[CellModel alloc] initialize:@"name"     title:@"Name"          value: self.currentProfile.name]];

您拥有alloc-init返回的对象,并且您有责任通过向其发送releaseautorelease消息来放弃对其的所有权。

正如您所建议的那样,使用临时变量可以解决问题:

CellModel *model = [[CellModel alloc] initialize:@"name" title:@"Name" value: self.currentProfile.name];
[self.naw_rows addObject: model];
[model release];

那么,为什么分析仪会抱怨?由于您的初始化程序的名称。将其重命名为initWithName:title:value:,您将看到“调用者此时不拥有的对象的引用计数的不正确减少”消失。

惯例是初始化方法的名称应以缩写init开头。

此外,您的类的实现不会将self分配给调用super的初始值设定项的结果。这样:

if (self == [super init])

应该是:

if ((self = [super init]))

或者,如果您愿意:

self = [super init];
if (self)

此外,CellModel类的实例变量的内存管理是错误的。您应该保留或复制作为参数传递给init方法的对象,并在dealloc中释放它们。

访问器方法也会破坏naming conventions,它们应该只被命名为nametitle等。前缀“get”仅适用于间接返回对象的方法。

答案 1 :(得分:0)

我认为这是因为CellModel拥有该对象。虽然你已经发布它,但对象却没有。要修复此添加代码以在dealloc方法中释放数组。

-(void)dealloc
{
    [self.naw_rows release];
    [super dealloc];
}

另外,作为旁注,您通常不应该依赖retainCount,因为它很容易产生误导。