通过调用addChild泄漏对象

时间:2012-05-27 20:20:48

标签: objective-c ipad memory-leaks cocos2d-iphone

我有一个名为Hexagon的自定义类,它是NSObject的子类。但是,当我将它分配给精灵并通过调用-addChild:将其添加到屏幕时,它的保留计数为2!我该怎么办,以阻止泄漏?

 for (int i =0; i < HEXCOUNT; i++){
        Hexagon *nHex = [[Hexagon alloc]initWithDicitonary:hexPositions];
        CCSprite *theSprite = (CCSprite*)nHex;
        NSString *hexName = [NSString stringWithFormat:@"hexagon%d", i];
        CGPoint location = CGPointFromString([[EXHEXAGONS objectForKey:hexName]objectForKey:@"position"]);
        CGPoint nLocation = ccp(screenSize.width/2 + 68 * location.x,screenSize.height/2 + 39 * location.y);
        theSprite.position = nLocation;

        [self addChild:theSprite z:1 tag:i];

        NSMutableDictionary *hexProperties = [EXHEXAGONS objectForKey:hexName];
        [hexProperties setObject:theSprite forKey:@"realSprite"];
        [EXHEXAGONS setObject:hexProperties forKey:hexName] ;
        [[GameStateSingleton sharedMySingleton]setExistingHexagons:EXHEXAGONS];

    [nHex release];

    }

2 个答案:

答案 0 :(得分:4)

不要依赖retainCount做任何事情。 retainCount为2并不意味着对象正在泄漏。只有乐器可以告诉你。

使用alloc / init创建Hexagon对象将添加+1的保留计数。将其添加为子项将添加+1。因此,根据您记录retainCount的位置,它可能是正确的。

如果您担心内存泄漏,请务必start using ARC

答案 1 :(得分:1)

首先,担心保留计数是没有效率的,除非您确认在保留它的所有各种对象完全释放后它没有被解除分配。

其次,大概是您将对象放入NSArray内的NSSetNSDictionaryaddChild:z:tag:?因此,这将使其保留数量增加一个。

您还将Hexagon对象投放到CCSprite并将其添加到NSDictionary hexProperties,这将为您的保留计数再添加1。

当你{@ 1}}你的对象位于循环底部时,你的保留计数将至少 3. release之后它应该至少 2。