我通常初始化init方法中的所有类成员,并使用setter来设置这些变量:
//Question.m file
-(id)init{
self = [super init];
if (self == nil) {
}
else {
tid = [[NSString alloc]initWithString:@""];
title = [[NSString alloc]initWithString:@""];
}
return self;
}
我正在做这样的事情:
//OtherClass.m file
Question *q = [[Question alloc]init];
q.tid = aString;
q.title = bString;
[questions addObject:q];
我还在Question类中的dealloc方法中释放所有内容。如果我使用Instruments测试内存泄漏,那么它会显示内存泄漏,但我不明白为什么。 在不导致内存泄漏的情况下初始化类的最佳方法是什么?
答案 0 :(得分:3)
黄金法则是,如果你自己分配一个对象而不是使用任何静态/工厂方法,那么你自己也必须负责释放它。
在你的情况下,我可以看到你使用alloc分配问题。所以你必须确保释放它。在调用addObject之后添加这一行,它应该解决你的内存泄漏问题。
[q release];
答案 1 :(得分:0)
q.tid
和q.title
在init
中分配并初始化,然后被第二段代码覆盖。
他们需要先释放。
答案 2 :(得分:0)
问题几乎肯定是以下两行:
q.tid = aString;
q.title = bString;
之后,在q方法中,在init方法中分配的tid和title指针正在悬空。
答案 3 :(得分:0)
尝试创建以下setter:
//Question.m
-(void)setTID:(NSString)string {
if (string == tid)
return;
[ tid release ];
tid = [ string retain ];
}
-(void)setTitle:(NSString)string {
if (string == title)
return;
[ title release ];
title = [ string retain ];
}
然后执行以下操作:
//OtherClass.m file
Question *q = [[Question alloc]init];
[ q setTID: aString ];
[ q setTitle: bString ];
我相信这是这样的(如果有人想纠正我,请做)。还要确保在问题的dealloc中发布tid和title。
编辑:更新了注释中所述的setter。