2012-01-11 2 views
0

У меня есть очень странные ошибки с помощью NSMutableArray в cocos2d/Xcodeобъект внутри NSMutableArray не обновлять сразу после обновления

В моем коде, у меня есть NSMutableArray объект, содержащий

NSMutableArray *peasantArray; 

и другой NSMutableArray Содержат объект в

NSMutableArray *treeArray; 

в запланированной функции обновления, я назвал другую функцию, которая, по существу, следующие функции: Я бы прошел через весь объект A внутри * peasantArray, и если какой-либо крестьянский объект имеет переменную var == GameEntityCommandIdling, я бы изменил объект B во втором NSMutableArray * treeArray,

Проблема в том, что я замечаю иногда после того, как я модифицировал объект A внутри peasantArray, измененная переменная (var) модифицируется/обновляется внутри объекта A после того, как печатается статус переменной плановым образом; но если я снова займусь NSMutableArray * peasantArray в следующем расписании (1/30s), я снова найду объект A со старой/не обновленной переменной (var), и это приводит к неправильному алгоритму ,

Однако, если я цикл через NSMutableArray * peasantArray меньше, чем 1second, каждый раз, когда я хотел бы видеть переменную (VAR) для объекта а правильно, как обновленной переменной величины,

так есть ограничение на быстро я могу перебирать NSMutableArray?

вот некоторые кусок кода, который я в основном только что упомянул,

NSMutableArray *peasantArray; 
NSMutableArray *treeArray; 

.....

peasantArray = [[[NSMutableArray alloc] initWithCapacity:1]retain]; 
for(int i = 0; i < 1; i++) 
{ 
    Peasant *A = [[Peasant alloc] init]; 
    [peasantArray addObject:A]; 
} 

.... // внутри обновление()

for (int i = 0;i < [peasantArray count];i++) 
{ 
    Peasant *A = [peasantArray objectAtIndex:i]; 
    if (A.status == something) 
    { 
     printf("A.status is something\n"); 
     A.status = sometingelse; 

     ... 
     //update other things not related to this NSMutableArray or object 
    } 
} 

.....

SO ошибка в том, что иногда у меня будет несколько Printf из «A.status что-то», хотя только один из него должен быть напечатан,

Я очень признателен за любую помощь,

Спасибо,

+0

Какой тип 'статус'? Это «NSString»? – Anna

ответ

1

Так есть предел того, насколько быстро я могу перебрать NSMutableArray?

Определенно нет. Это была бы самая глупая реализация массива, с которым я когда-либо сталкивался. :)

Простейшим объяснением обычно является ответ.Вы говорите, что сообщение печатается несколько раз. Хорошо, вы проверили, что, возможно, более одного крестьянина имеет статус, установленный на что-то?

Если это не так, вы уверены, что обновление статуса дважды печатается в одном фрейме, а не дважды в двух последующих обновлениях?

Раньше вы указывали, что эффект итерации по одному массиву и модификации объектов другого массива каким-то образом аннулируется. Это заставило меня заметить, что если у вас есть один и тот же объект в обоих массивах, модификация свойств объекта в массиве A также изменит свойства того же объекта, который содержится в массиве B.

Возможно, вы захотите до give breakpoints a(nother) try. Проблема должна быть легко обнаружена при прохождении кода.

+0

Спасибо, ошибка в чем-то похожа на ваш ответ. Я неправильно модифицировал один и тот же объект. Переменная (var), – user1143056

0

Здесь у вас есть память утечки

for(int i = 0; i < 1; i++) 
{ 
    Peasant *A = [[Peasant alloc] init]; 
    [peasantArray addObject:A]; 
} 

Вам следует освободить, после добавления его в массив, так как AddObject добавляет счетчик ссылок на объект.

for(int i = 0; i < 1; i++) 
{ 
    Peasant *A = [[Peasant alloc] init]; 
    [peasantArray addObject:A]; 
    [A release]; 
} 
Смежные вопросы