0

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

    }
4

2 に答える 2

4

何もretainCountに依存しないでください。保持カウントが2の場合は、オブジェクトがリークしていることを意味するわけではありません。インスツルメンツだけがあなたにそれを伝えることができます。

alloc / initを使用してHexagonオブジェクトを作成すると、保持カウントが+1になります。子として追加すると+1が追加されます。したがって、retainCountをログに記録する場所によっては、正しい場合があります。

メモリリークが心配な場合は、ぜひARCの使用を開始してください。

于 2012-05-27T20:33:35.687 に答える
1

まず、保持カウントを気にすることは、それを保持しているさまざまなオブジェクトから完全に解放されたときに割り当てが解除されていないことを確認しない限り、生産的ではありません。

次に、オブジェクトをNSArrayNSSet、またはNSDictionary内に配置していると思われaddChild:z:tag:ます。そのため、保持カウントが 1 つ増えます。

Hexagonまた、オブジェクトを にキャストしCCSpriteて に追加するとNSDictionary hexProperties、保持カウントにさらに 1 が追加されます。

オブジェクトがループの最後に到達するまでreleaseに、保持カウントは少なくとも3 になります。その後は、少なくとも2releaseになるはずです。

于 2012-05-27T20:42:01.057 に答える