1

看看下面的代码:

    CCSprite* testsprite = [CCSprite spriteWithFile:@"test.png"];
    CCLOG(@"1. count: %d", [testsprite retainCount]);
    [self addChild:testsprite];
    CCLOG(@"2. count: %d", [testsprite retainCount]);
    [testsprite runAction: [CCMoveTo actionWithDuration:3.0 position:CGPointMake(200.0, 200.0)]];
    CCLOG(@"3. count: %d", [testsprite retainCount]);

这段代码的输出是:

1. count: 1
2. count: 2
3. count: 3

我想我明白这里发生了什么。问题如下:Cocos2D 何时(在哪些方法中)保留对象(在本例中为 testsprite)是否有经验法则?

再见,克里斯蒂安

4

2 回答 2

2
  1. 如果可能,请使用类函数,因为它们是自动释放的。
  2. 使用 addChild 添加 CCNode 将保留该节点。如果你做了一些 alloc init 的东西,在添加它作为孩子之后释放它
  3. 向数组中添加任何内容都会保留该对象。如果将对象添加到数组中,则可以安全地释放它。

自动发布:

CCSprite *sprite = [CCSprite spriteWithFile:@"icon.png"];

手动内存管理

CCSprite *sprite = [[CCSprite alloc] initWithFile:@"icon.png"];

不要让retainCount 混淆你。每一行代码都可能会保留该对象。如果做得好,底层代码会在完成后自动释放。

当您必须键入 release 时的一个常见示例。

NSMutableArray *units = [NSMutableArray array];
for (int i = 0; i < 42; i++)
{
    CCNode *unit = [[MyUnit alloc] init]; // retain +1
    [units addObject:unit]; // retain +1
    [unit release]; // retain -1
}
于 2012-06-24T18:17:45.683 回答
1

该规则与任何其他 Cocoa 代码相同:在需要保留某些内容时保留它。完成后释放它。

此外,该retainCount方法通常是无用的。

于 2012-06-24T17:50:50.150 回答