这会导致内存泄漏吗?

时间:2011-03-22 04:22:59

标签: objective-c memory-management

我通常初始化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测试内存泄漏,那么它会显示内存泄漏,但我不明白为什么。 在不导致内存泄漏的情况下初始化类的最佳方法是什么?

4 个答案:

答案 0 :(得分:3)

黄金法则是,如果你自己分配一个对象而不是使用任何静态/工厂方法,那么你自己也必须负责释放它。

在你的情况下,我可以看到你使用alloc分配问题。所以你必须确保释放它。在调用addObject之后添加这一行,它应该解决你的内存泄漏问题。

[q release];

答案 1 :(得分:0)

q.tidq.titleinit中分配并初始化,然后被第二段代码覆盖。

他们需要先释放。

答案 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。