Ios 内存泄漏,MutableArray中的对象未释放?
Xcode告诉我下面的代码在内存泄漏方面存在一些问题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"
@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”开头。