2013-04-02 3 views
2

Я заполняю NSMutableArray CCSprites и добавляю их к текущему слою, который добавляется в сцену. Когда я пытаюсь получить доступ к элементам массива я получаю плохую ошибкуПлохой доступ с массивом спрайтов

sprites = [[[NSMutableArray alloc] init]autorelease]; 

    int j = 0; 

    for (int i=0; i<[sprites count]; i++) 
    { 
     j=i+1; 
     sprite = [CCSprite spriteWithFile:[NSString stringWithFormat:@"intro%d.png",j]]; 
     sprite.position = ccp(WIDTH/2, HEIGHT/2+(i*HEIGHT)); 
     [sprites addObject:sprite]; 

    } 

    for (int i = 0; i<[sprites count]; i++) 
    { 
     [self addChild:[sprites objectAtIndex:i]]; 
    } 


    [self scheduleUpdate]; 


} 
return self; 

Это делается в методе инициализации и спрайты и спрайт объявлены в заголовочном файле доступа. Внутри метода обновления у меня есть

sprite = [sprites objectAtIndex:1]; 
sprite.position = ccpAdd(sprite.position, ccp(0,dy)); 
CCSprite* spr = [sprites objectAtIndex:2]; 
spr.position = ccpAdd(spr.position, ccp(0,dy)); 

Когда управление передается методу обновления, я получаю плохой доступ. Я был бы рад, если бы кто-нибудь мог мне помочь

+0

Рассмотрите возможность использования ARC – LearnCocos2D

ответ

0

Это происходит из-за того, что вы создали объект автоопределения, который затем попытается получить доступ позднее в вашем обновленном коде. В массиве спрайтов есть счетчик с нулевым значением (поскольку он является авторекламой) и получает освобождение, затем вы пытаетесь получить к нему доступ и получаете ошибку с плохим доступом.

Чтобы исправить, вы должны не сделать массив спрайтов авторекламой. Поскольку вы планируете использовать объект позже в своем коде, вы должны сохранить его сохраненным (не добавляя авторекламу). Затем вы также должны освободить массив в методе dealloc (независимо от родительского объекта, который работает в массиве).

- (void) dealloc { 
    [ sprites release ]; 
    [ super dealloc ]; 
} 
+0

Спасибо, что ваш ответ был очень полезным. Я благодарен. – user2237439

0

Вы должны сохранить массив спрайтов (убедитесь, что вы отпустите его в dealloc объекта). Поскольку он авторезистентен, в течение цикла от вашего init до вашего метода обновления он освобождается.

Также (странно), если ваш код показан так, sprites.count равен 0, когда вы начинаете свой первый цикл. Вы не получите много там :).

0

Остальные вправо (autorelease вызов является виновником - вы должны просто удалить его, а затем освободить массив в dealloc метод сцены).

Также обратите внимание, что [[[NSMutableArray alloc] init]autorelease] имеет такой же эффект, что и [NSMutableArray array] (для вашего сценария, тем не менее, это не то, что вам нужно).

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