Ios 内存泄漏,MutableArray中的对象未释放?

Ios 内存泄漏,MutableArray中的对象未释放?,ios,memory-leaks,nsmutablearray,retain,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"

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行都出现以下错误:

在线上分配的对象的潜在泄漏--方法返回 具有+1保留计数(拥有引用)对象的Objective-C对象 第行已分配--稍后在此执行路径中不被引用 并且保留计数为+1(对象泄漏)

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

CellModel *model = [[CellModel alloc] initialize:@"name" title:@"Name" value: self.currentProfile.name];
[self.naw_rows addObject: model];
[model release];
但这给了我以下错误:

不正确的对象引用计数递减率不是 此时由调用方拥有

那么我做错了什么?在我的第一段代码中,retain计数应该是1。由阵列所有。我假设在使用[array RemoDealObjects]时对象被释放

提前感谢,


Nico

我认为这是因为CellModel拥有该对象。虽然您已经释放了它,但对象尚未释放。要修复此问题,请添加代码以释放dealloc方法中的数组

-(void)dealloc
{
    [self.naw_rows release];
    [super dealloc];
}
另外,作为旁注,您通常不应该依赖重新计算,因为它很容易产生误导。

此漏洞:

[self.naw_rows addObject: [[CellModel alloc] initialize:@"name"     title:@"Name"          value: self.currentProfile.name]];
您拥有alloc init返回的对象,您有责任通过向其发送
release
autorelease
消息来放弃对该对象的所有权,但您没有这样做

按照您的建议,使用临时变量确实可以解决问题:

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中释放它们


访问器方法也打破了传统,它们应该简单地命名为
name
title
,等等。前缀为“get”仅适用于间接返回对象的方法。

super dealloc
应该在末尾。它实际上有区别吗?请看一看。我认为该对象是直接添加到数组中的,并且保留计数仅为1。但我知道它是创建+1,然后添加到数组+1中的。谢谢你的帮助@nvz.solutions欢迎您!p、 最好从所有权的角度考虑,而不是从绝对保留计数的角度考虑。还要注意的是,所有实例变量内存管理也都是错误的。IVAR也没有得到正确的保留/释放。另外,getter方法不应该以“get”开头。