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;