Я вижу несколько проблем в вашем коде.
Одним из них является объект CCLabel, вы инициализируете его как объект автоматического выпуска с помощью статического инициализатора cocos2d:
self._label = [CCLabel labelWithString:@"" fontName:@"Arial" fontSize:32];
Но в методе dealloc вы освобождаете его, даже если он является объектом автоматического выпуска:
- (void)dealloc {
[label release];
label = nil;
[super dealloc];
}
Вы не должны выпускать ярлык, так как он настроен на автоматическое высвобождение cocos2d! Это гарантированный сбой!
Тогда вы усложняете ситуацию:
[[CCDirector sharedDirector] replaceScene:[[[HelloWorld alloc] init] autorelease]];
alloc / init / autorelease полностью излишен, потому что вы можете просто написать [HelloWorld scene], если класс HelloWorld имеет метод сцены + (id) (обычно это так и должно быть). Если нет, используйте [HelloWorld узел]. Всегда предпочитайте статические инициализаторы автоматического высвобождения cocos2d перед использованием alloc / release для объектов cocos2d. Единственный раз, когда вам нужно выделить класс cocos2d, это когда вы явно не добавляете его как дочерний элемент к какому-либо другому узлу, что встречается редко.
Наконец, это очень плохой стиль:
-(id) init
{
if( (self=[super initWithColor:ccc4(255,255,255,255)] )) {
Если супер реализация initWithColor вызывает [self init] - что часто имеет место и даже если нет, может измениться в будущих выпусках cocos2d - это вызовет вашу реализацию init, что приведет к бесконечному циклу (переполнение стека) , Чтобы исправить это, просто переименуйте ваш метод init или вызовите [super init] и предоставьте параметры другим способом, обычно для этого есть свойство или метод установки.
И небольшая проблема: Apple не советует использовать начальные подчеркивания в качестве префикса переменной-члена. Фактически, многие другие поставщики компиляторов тоже советуются с этим, поскольку часто системные внутренние переменные используют один или два подчеркивания в качестве префикса. Стиль cocos2d с завершающими подчеркиваниями предпочтителен, поэтому вы должны написать label_ вместо _label.