1

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

  • ViewController 初始化一个实例
  • ClipData 类初始化一个实例
  • 初始化字符串的 AnimationData 类

视图控制器:

myClipData = [[ClipData alloc] init];

剪辑数据:

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

    return self;
}

动画数据:

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

    return self;
}

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

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

谢谢,
邓克斯

4

2 回答 2

2

您永远不会释放 animData。您需要添加dealloc到您的课程:

- (void)dealloc {
  [animData release];

  [super dealloc];
}

同样,您需要添加一个dealloc类似于AnimationData.

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

于 2012-04-27T10:05:11.453 回答
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;
于 2012-04-27T10:06:10.177 回答