【问题标题】:Memory management with C array in Objective C在 Objective C 中使用 C 数组进行内存管理
【发布时间】:2012-05-09 07:52:19
【问题描述】:

我在目标 c .m 文件中使用了一个 c 样式数组:

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 数组吗?

【问题讨论】:

标签: iphone objective-c ios arrays memory


【解决方案1】:

没有必要释放数组,因为你不分配它。

您确定 spriteWithSpriteFrameName 不返回 autoreleased 对象吗(其命名约定表明确实如此)?

【讨论】:

  • spriteWithSpriteFrameName 返回一个自动释放对象。这有关系吗?
  • @DragonDoingPragramming 是的,这很重要——就像你对NSString 所做的那样,你需要retain 它。
【解决方案2】:

你不必释放 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 数组

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

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

【讨论】:

  • @interface 礼物:NSObject { NSString *name; CCSprite *精灵;没见过这种实现,能解释一下吗?
  • eeee...,你没见过是什么意思?它是Objective-C中Object的定义,就像NSString和CCSprite等一样。
  • 嗯...是的 :) 我认不出来,哈哈
  • 检查一下,它是如此的基本。 :) nicolaslarrea.blogspot.com/2011/05/creating-custom-object.html
猜你喜欢
  • 1970-01-01
  • 2012-08-08
  • 2020-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-28
相关资源
最近更新 更多