2012-06-24 3 views
1

, взглянув на следующий код:Когда Cocos2d сохраняет объекты?

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 сохраняет объекты (в данном случае testprite)?

Bye, Christian

+0

Не беспокойтесь о том, чтобы сохранить счет. Сохраните объект, когда вы его получите, отпустите, когда закончите. Если бы каждый выполнял свою работу, проблем не было. – EmilioPelaez

ответ

2
  1. Если возможно, используйте функции класса, поскольку они автореализованы.
  2. Добавление CCNode с помощью addChild сохранит узел. Если вы сделали некоторый набор init init, отпустите его после добавления в качестве дочернего объекта
  3. Добавление чего-либо в массив сохраняет объект. Вы можете безопасно освободить объект, если вы добавили его в массив.

autoreleased:

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

ручное управление памятью

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

Dont пусть retainCount сбить вас с толку. Каждая строка кода, возможно, сохранит объект. Если это будет сделано хорошо, базовый код автоматически выпустит его после его завершения.

Обычный пример, когда вы должны ввести выпуск.

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 
} 
+0

Спасибо за ответ. Еще один вопрос: если в вашем последнем фрагменте кода я бы назвал [units release] позже, это освободит массив и все объекты (CCNodes), назначенные этому массиву? – itsame69

+0

Да, если вы отпустите массив, он выпустит полный контент. Все MyUnits освобождаются после выпуска [units release]; – zeiteisen

1

The rule такая же, как для любого другого кода какао: сохранить что-то, когда вам это нужно, чтобы остаться. Отпустите его, когда закончите с ним.

Кроме того, метод retainCountis generally useless.

Смежные вопросы