我有一个名为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];
}
答案 0 :(得分:4)
不要依赖retainCount做任何事情。 retainCount为2并不意味着对象正在泄漏。只有乐器可以告诉你。
使用alloc / init创建Hexagon对象将添加+1的保留计数。将其添加为子项将添加+1。因此,根据您记录retainCount的位置,它可能是正确的。
如果您担心内存泄漏,请务必start using ARC。
答案 1 :(得分:1)
首先,担心保留计数是没有效率的,除非您确认在保留它的所有各种对象完全释放后它没有被解除分配。
其次,大概是您将对象放入NSArray
内的NSSet
,NSDictionary
或addChild:z:tag:
?因此,这将使其保留数量增加一个。
您还将Hexagon
对象投放到CCSprite
并将其添加到NSDictionary
hexProperties
,这将为您的保留计数再添加1。
当你{@ 1}}你的对象位于循环底部时,你的保留计数将至少 3. release
之后它应该至少 2。