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]
时会释放这些对象提前致谢,
尼科
答案 0 :(得分:2)
泄漏:
[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中释放它们。
访问器方法也会破坏naming conventions,它们应该只被命名为name
,title
等。前缀“get”仅适用于间接返回对象的方法。
答案 1 :(得分:0)
我认为这是因为CellModel拥有该对象。虽然你已经发布它,但对象却没有。要修复此添加代码以在dealloc方法中释放数组。
-(void)dealloc
{
[self.naw_rows release];
[super dealloc];
}
另外,作为旁注,您通常不应该依赖retainCount,因为它很容易产生误导。