objective-c类初始化方法中的内存泄漏

objective-c类初始化方法中的内存泄漏,objective-c,class,memory-management,initialization,memory-leaks,Objective C,Class,Memory Management,Initialization,Memory Leaks,我所创建的类的init方法中存在泄漏问题。为了保持简单,我有以下(简化的)问题: ViewController初始化的一个实例 初始化的实例的ClipData类 初始化字符串的AnimationData类 视图控制器: myClipData = [[ClipData alloc] init]; ClipData: - (id)init { self = [super init]; if (self) { animData = [[AnimationData

我所创建的类的
init
方法中存在泄漏问题。为了保持简单,我有以下(简化的)问题:

  • ViewController初始化的一个实例
  • 初始化的实例的ClipData类
  • 初始化字符串的AnimationData类
视图控制器:

myClipData = [[ClipData alloc] init];
ClipData:

- (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;
}
类中的所有对象都声明为
(非原子,保留)
。我知道这样做会增加保留计数,但是如何初始化
AnimationData
,而不泄漏
animData

可能是一个很愚蠢的问题,所以非常感谢您的帮助

谢谢,

Duncs

您永远不会发布数据。您需要将
dealloc
添加到您的类中:

- (void)dealloc {
  [animData release];

  [super dealloc];
}
同样,您需要将类似的
dealloc
添加到
AnimationData


另一方面,您需要保留并在以后释放在
-[AnimationData init]
中创建的字符串,您现在所做的基本上是一个noop,只是它留下了一个乱码指针。

当您有一个alloc时,您还必须有一个释放

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

所以你真的应该做:

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

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

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

实际上,多亏了Cocoa的ann实现细节,他很幸运地使用了
[NSString]
方法,因为它返回了对一个永远不会消失的常量(空)字符串的引用。@JeremyP:尽管如此,这不是你应该依赖的行为。不,它不是,我不是想暗示你应该依赖它。我只是补充了一点,解释了为什么使用Cocoa的当前实现,这些UNC实际上不会因此看到垃圾字符串。我犯了一个巨大的学童错误。我想我脑子里仍然有一些关于内存分配的未解决的问题,但现在我明白了这一点。谢谢你,爸爸!事实上,蒙格斯-非常感谢。我不确定我是否理解将新的ClipData分配给对象,然后释放该对象的好处。我当然可以直接调用self.myClipData=[[ClipData alloc]init]???我通过使用dealoc方法设法解决了泄漏问题,我忘了添加dealoc方法,但关键是Williham首先到达了那里。非常感谢!alloc将给对象一个1的引用计数。将其指定给保留对象的属性将使计数增加到2。因此,您需要一个释放来将计数设置回1。在你的问题中,你不是通过属性赋值,所以你是在避免额外的retain。我喜欢看到alloc和release放在一起,以避免混淆。
self.myClipData = nil;
self.animData = nil;