Objective c 通过调用addChild泄漏对象

Objective c 通过调用addChild泄漏对象,objective-c,ipad,memory-leaks,cocos2d-iphone,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*)nHe

我有一个名为
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];

    }
for(int i=0;i
任何事情都不要依赖重新计算。重新计数2并不意味着对象正在泄漏。只有仪器能告诉你这一点

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


如果您担心内存泄漏,请务必这样做。

任何事情都不要依赖于重新计算。重新计数2并不意味着对象正在泄漏。只有仪器能告诉你这一点

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


如果您担心内存泄漏,请务必这样做。

首先,担心保留计数是无效的,除非您正在验证它在从保留它的所有对象完全释放时没有被释放

其次,假设您正在将对象放入
addChild:z:tag:
中的
NSArray
NSSet
NSDictionary
?所以,这将使它的保留计数增加1

您还可以将
Hexagon
对象强制转换为
CCSprite
,并将其添加到
NSDictionary
hexagoproperties
,这将在保留计数中再添加一个1


当您
释放位于循环底部的对象时,您的保留计数将至少为3。在
释放之后
至少应该是2。

首先,担心保留计数是无效的,除非您验证在从保留计数的所有对象完全释放时,它没有被释放

其次,假设您正在将对象放入
addChild:z:tag:
中的
NSArray
NSSet
NSDictionary
?所以,这将使它的保留计数增加1

您还可以将
Hexagon
对象强制转换为
CCSprite
,并将其添加到
NSDictionary
hexagoproperties
,这将在保留计数中再添加一个1


当您
释放位于循环底部的对象时,您的保留计数将至少为3。在
释放后
至少应2。

我使用仪器检测泄漏,它向我显示了准确的代码行。我第一次被告知(我从来没有研究过),我可以将ARC与cocos2D结合使用。。。但是我该怎么做呢?如何为cocos2d启用ARC:Alternative:使用Kobold2D()。已经在所有项目中启用了ARC。我试图使用您的(视频)教程,但它不起作用,并向我抛出70个错误。我现在如何解决这个问题(顺便说一句,我也在一个新项目中尝试过,结果是一样的……我使用仪器来检测泄漏,它向我展示了准确的代码行。我刚刚第一次被告知(嗯,我从未研究过)我可以将ARC与cocos2D一起使用…但我该如何做?如何为cocos2D启用ARC:备选方案:使用Kobold2D()。ARC已在所有项目中启用。我尝试使用您的(视频)教程,但它不起作用,并向我抛出70个错误。我现在如何解决此问题(顺便说一句,我在一个新项目中也尝试了它,结果是一样的…
retainCount
完全没有用。不要调用它。
retainCount
完全没有用。不要调用它。那么,我如何防止它泄漏呢?你如何确定你有泄漏?在这一点上,你只表达了对保留计数I太高了。您是否从
hexProperties
中释放了对象,以及从
addChild
中保存对象的任何容器/对象?如果此时确实存在泄漏(对象未被释放),则需要检查您在
addChild
中执行的操作(以及它调用的方法)。问题不在上面的代码片段中。那么,我如何防止它泄漏?您如何确定您有泄漏?此时,您只表示担心保留计数太高。您是否已从
hexProperties
释放对象以及保存该对象的任何容器/对象从
addChild
?如果此时确实存在泄漏(对象未被释放),则需要检查在
addChild
(及其调用的方法)中执行的操作。问题不在上述代码段中。