0

私はObjectiveC.mファイルで使用されているacスタイルの配列を持っています:

Gift gifts[3];

そして、Giftは次のように定義された構造体です。

typedef struct {
    NSString *name;
    CCSprite *sprite;
}Gift;

これが私が配列を使用する方法です

for (int i=0; i<3; i++) {
    gifts[i].name = [[NSString stringWithFormat:@"Reward%d_%@.png", i+1, location] retain];
    gifts[i].sprite = [CCSprite spriteWithSpriteFrameName:gifts[i].name];
    CGPoint pos = [[GameConfigure sharedManager] getCoordinateforKey:@"REWARD_ITEM"];
    gifts[i].sprite.position = ccp(pos.x+i*238, pos.y);
    [rewardLayer addChild:gifts[i].sprite z:1 tag:100+i];
}

メモリを管理するにはどうすればよいですか?
Cアレイを解放する必要がありますか?

4

2 に答える 2

0

C配列を解放する必要はありませんが、C配列でオブジェクトを管理する必要があります

あなたのコードで

for (int i=0; i<3; i++) {

    //retain is good, but if you don't release it at the end ,  it leaks!!!!
    gifts[i].name = [[NSString stringWithFormat:@"Reward%d_%@.png", i+1, location] retain];

    //here is not a good idea, why you don't retian here?  it will be autorelease 
    gifts[i].sprite = [CCSprite spriteWithSpriteFrameName:gifts[i].name];

    CGPoint pos = [[GameConfigure sharedManager] getCoordinateforKey:@"REWARD_ITEM"];
    gifts[i].sprite.position = ccp(pos.x+i*238, pos.y);
    [rewardLayer addChild:gifts[i].sprite z:1 tag:100+i];
}

構造体 GIFT の代わりに NSObject を作成することをお勧めします

メンバーのプロパティを使用

@interface GIFT : NSObject
{
    NSString *name;
    CCSprite *sprite;
}

@property (nonatomic, retain) NSString *name;
@property (nonatomic, retain) CCSprite *sprite;

@end

C配列の代わりにNSArrayを使用します

NSArray *gifts = [NSArray arrayWithObjects:
                                         [[[GIFT alloc] init] autorelease],
                                         [[[GIFT alloc] init] autorelease],
                                         [[[GIFT alloc] init] autorelease],
                                         nil];

それでもC配列を使用したい場合は、ギフトの構造体で参照カウントを管理してみてください

于 2012-05-09T08:07:10.977 に答える
0

配列を割り当てないため、配列を解放する必要はありません。

spriteWithSpriteFrameNameがオブジェクトを返さないことを確信していますかautoreleased(その命名規則では、オブジェクトが返されることが示唆されています)。

于 2012-05-09T07:54:09.737 に答える