【发布时间】:2011-01-15 05:47:22
【问题描述】:
我在我的主线程中这样做:
CCAnimation *anim; //class variable
[NSThread detachNewThreadSelector:@selector(loadAimation) toTarget:self withObject:nil];
在加载动画中:
-(void) loadAnimation {
NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init];
anim = [[CCAnimaton alloc] init];
[autoreleasepool drain];
}
在主线程中我释放它:
[anim release];
现在我想问一下关于内存管理是否可以。
【问题讨论】:
-
loadAimation应该是loadAnimation吗?为什么anim是类变量而不是属性?发布的代码是什么?没有足够的信息来判断对象的创建和销毁是否平衡。 -
是的,你是对的,我想问题出在发布时确实发生了什么事,(我只是想问问这样做是否可以)。实际上它与发布前的 cocos2d 有关 我正在制作 CCAction 并且我有一个 CCSprite *sp,我只是在做 [sp runAction:anim];在动画运行时我正在释放它,虽然动画在视觉上没有任何变化,但它是对的吗?
-
这取决于一切是如何实现的。任何获得所有权的对象都将保留动画。如果对象没有取得所有权,它就不会保留动画。检查 cocos2d 文档的所有权规则。即便如此,您仍然可能遇到导致内存管理问题的race condition(例如,动画在拥有对象可以保留在另一个线程中之前在一个线程中释放)。
-
不,我的程序中没有竞争条件,但我的问题得到了解决。这段代码的概念很好,但正如你所指出的,不能有竞争条件。感谢您的回复。
标签: objective-c multithreading memory-management nsautoreleasepool