Ste*_*veB 1 iphone memory-leaks objective-c nsmutablearray cocos2d-iphone
我正在用cocos2d制作一个iPhone应用程序,我在使用泄漏工具标记了一个NSMutableArray时遇到了一些麻烦,我的应用程序显然正在泄漏.我已经解决了这个问题,但我真的不明白为什么它首先出现了,所以希望有人可以向我解释.
我已经将CCParticleSystemQuad子类化了,这样我就可以添加一些实例变量,包括名为'damagedObjects'的NSMutable数组:
@interface SonicBoom : CCParticleSystemQuad{
NSMutableArray *damagedObjects;
HelloWorldLayer *gameClass;
CGPoint radiusPoint;
CGPoint origin;
}
@property(nonatomic, retain) NSMutableArray *damagedObjects;
@property(nonatomic, retain) HelloWorldLayer *gameClass;
@property CGPoint radiusPoint;
@property CGPoint origin;
@end
Run Code Online (Sandbox Code Playgroud)
这被初始化并且在主游戏类中分配了damagedObjects数组,通过设置autoRemoveOnFinish属性在完成时移除粒子系统:
-(void)createSonicBoom{
sonicBoom = [SonicBoom particleWithFile:@"SonicBoom.plist"];
sonicBoom.damagedObjects = [[NSMutableArray alloc]init];
sonicBoom.gameClass = self;
sonicBoom.autoRemoveOnFinish = YES;
//etc..........
Run Code Online (Sandbox Code Playgroud)
然后我重写了'SonicBoom'类的dealloc方法,以释放'damagedObjects'数组:
-(void)dealloc{
NSLog(@"Removing SonicBoom");
NSLog(@"damaged objects retain count = %i", damagedObjects.retainCount);
gameClass.sonicBoomActive = NO;
[damagedObjects removeAllObjects];
[damagedObjects release];
[damagedObjects release];
[super dealloc];
}
Run Code Online (Sandbox Code Playgroud)
出于某种原因,只有一个发布消息到阵列我得到了泄漏.我检查了保留计数(我从不打扰通常考虑这些),它是2,所以我现在发送两次发布消息,这似乎已经解决了问题.
这是发布它的最佳方式,有人可以解释为什么需要这样做吗?
谢谢
这是因为这条线:
sonicBoom.damagedObjects = [[NSMutableArray alloc]init];
Run Code Online (Sandbox Code Playgroud)
init将引用计数增加1,然后设置保留属性也会增加它.
将其更改为:
NSMutableArray *array = [[NSMutableArray alloc]init];
sonicBoom.damagedObjects = array;
[array release];
Run Code Online (Sandbox Code Playgroud)
或者你可以使用:
sonicBoom.damagedObjects = [NSMutableArray array];
Run Code Online (Sandbox Code Playgroud)
它返回一个自动释放的对象,并且您拥有的唯一对象是它与setter保留的对象.
另外,FWIW通过在dealloc中释放两次来修复泄漏绝对不是一个好主意.如果有一天你决定damagedObjects
使用其他方法设置返回一个自动释放的数组,你的应用程序将开始崩溃并追踪崩溃,这可能是一个痛苦.