0

我在目标 c .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];
}

你最好创建一个 NSObject 而不是 struct GIFT

使用成员的属性

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

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

@end

并使用 NSArray 而不是 C Array

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

但如果您仍想使用 C 数组,请尝试管理 GIFT 结构中的引用计数

于 2012-05-09T08:07:10.977 回答
0

无需释放数组,因为您不分配它。

你确定它spriteWithSpriteFrameName不会返回一个autoreleased对象(它的命名约定表明它会返回)?

于 2012-05-09T07:54:09.737 回答