NSMutable数组泄漏

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,所以我现在发送两次发布消息,这似乎已经解决了问题.

这是发布它的最佳方式,有人可以解释为什么需要这样做吗?

谢谢

Chr*_*isH 5

这是因为这条线:

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使用其他方法设置返回一个自动释放的数组,你的应用程序将开始崩溃并追踪崩溃,这可能是一个痛苦.