2012-05-27 90 views
0

我有一個名爲Hexagon的自定義類,它是NSObject的子類。但是,當我將它分配給一個精靈並通過調用-addChild:將其添加到屏幕中時,它的保留計數爲2!我該怎麼做才能阻止這種泄漏?通過調用addChild泄漏對象

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]; 

    } 
+0

'retainCount'是完全無用的。別叫它。 – bbum

回答

4

不要依賴retainCount來做任何事情。 2的retainCount並不意味着該對象正在泄漏。只有樂器可以告訴你。

用alloc/init創建Hexagon對象會增加+1的保留計數。將它添加爲孩子將添加+1。因此取決於您記錄retainCount的位置,這可能是正確的。

如果您擔心內存泄漏,通過所有方式start using ARC

+0

我使用儀器來檢測泄漏,並向我顯示了確切的代碼行。我剛被告知第一次(呃,我從來沒有研究過),我可以使用ARC與cocos2D ...但我該怎麼做? –

+0

如何爲cocos2d啓用ARC:http://www.learn-cocos2d.com/2012/04/enabling-arc-cocos2d-project-howto-stepbystep-tutorialguide/ 替代方法:使用Kobold2D(http:// www。 kobold2d.com)。 ARC已經在所有項目中啓用。 – LearnCocos2D

+0

我試圖使用你的(視頻)教程,但它不起作用,並拋出像我70錯誤。我現在如何解決這個問題? :(順便說一下,我嘗試了一個新的項目,結果也是一樣的...... –

1

首先,擔心保留計數是不成效的,除非您正在驗證從保留它的所有各種對象完全釋放時沒有取消分配。

其次,想必您將對象放入addChild:z:tag:內的NSArray,NSSetNSDictionary?所以,這會讓它的數量增加一個。

你也投你Hexagon對象爲CCSprite,並把它添加到NSDictionaryhexProperties,這將另1添加到您的保留計數。

通過你的時間release在循環的底部你的目標,你的保留計數將至少 3. release後,它應該是至少 2.

+0

那麼,如何防止它泄漏呢? –

+0

你怎麼確定你有泄漏?在這一點上,你有隻是表示擔心保留數量太高你是否已經從'hexProperties' **發佈了對象**並且** addChild'中的任何容器/對象是否持有對象?如果此時你確實有泄漏(對象沒有被釋放),那麼你需要檢查你在'addChild'(和它調用的方法)中做了什麼。問題不在於上面的代碼片段中。 – gschandler