objective-c类init方法中的内存泄漏

时间:2012-04-27 10:01:04

标签: objective-c class memory-management initialization memory-leaks

我遇到了我创建的类的init方法泄漏问题。为了简单起见,我有以下(简化)问题:

  • ViewController初始化
  • 的实例
  • ClipData类,用于初始化
  • 的实例
  • 初始化字符串
  • 的AnimationData类

的ViewController:

myClipData = [[ClipData alloc] init];

ClipData:

- (id)init
{
    self = [super init];
    if (self) {
        animData = [[AnimationData alloc] init];  //LEAK HERE
    }

    return self;
}

AnimationData:

- (id)init
{
    self = [super init];
    if (self) {
        name = [NSString string];
    }

    return self;
}

类中的所有对象都声明为(nonatomic, retain)。我知道这样做会增加保留计数,但如何初始化AnimationData而不泄漏animData ???

可能是一个非常愚蠢的问题,所以任何帮助都非常感激。

谢谢,
Duncs

2 个答案:

答案 0 :(得分:1)

您永远不会发布animData。您需要在班级中添加dealloc

- (void)dealloc {
  [animData release];

  [super dealloc];
}

同样,您需要向dealloc添加类似的AnimationData

在相关的说明中,你需要保留并稍后释放在-[AnimationData init]中创建的字符串,你现在正在做的事实上是一个noop,除了它留下一个乱码指针。

答案 1 :(得分:0)

当你有一个分配时,你也必须有一个版本。

您还应该通过self引用属性,以便访问属性而不是基础成员。

所以你应该这样做:

ClipData *clip = [[ClipData alloc] init];
self.myClipData = clip;
[clip release];

并且

 if (self) {
        AnimationData *data = [[AnimationData alloc] init]; 
        self.animData = data;  
        [data release];
    }

确保通过将它们设置为nil来释放类的dealloc中的属性。

self.myClipData = nil;
self.animData = nil;