Странное поведение с локальными переменными в Objective-C

#objective-c #cocos2d-iphone #local-variables

#objective-c #cocos2d-iphone #локальные переменные

Вопрос:

Я наблюдаю некоторое странное поведение с локальной переменной во вложенном цикле for в objective-c.

Приведенный ниже код перебирает NSMutableArray, называемый visitors, размер которого может варьироваться от 1 до 20.

Я сохраняю локальную копию объекта в позиции i, а затем обрабатываю его ограничивающую рамку.

Затем я снова перебираю массив в рамках первого цикла, выбирая второй объект из списка и определяя его ограничивающую рамку.

Проверка на коллизию почти никогда не выполняется, когда объекты на экране перемещаются по кругу.

Когда я выполняю код с помощью отладчика, я наблюдаю во втором цикле for, что после установки переменной visitor2 она с этого момента никогда не меняется. Он продолжает указывать на тот же объект, пока вызов функции не будет завершен.

Все объекты в массиве visitors определенно являются полностью уникальными объектами, поскольку один и тот же объект не добавляется в массив дважды, я обязательно проверил это.

Я понятия не имею, что может быть причиной этого, я никогда не видел ничего подобного. Буду признателен за любую помощь.

Вот мой код:

 for (int i = 0; i < [visitors count]; i  ) 
{

    // Obtain visitor from the list
    Visitor* visitor1 = [visitors objectAtIndex: i];

    // Calculate it's bounding box
    CGRect visitor1rect = CGRectMake(visitor1.position.x - visitor1.size.x/2, 
                              visitor1.position.y - visitor1.size.y/2, 
                              visitor1.size.x, visitor1.size.y);

    // Loop through all other visitors
    for (int j = 0; j < [visitors count]; j  ) 
    {
        // Don't check for a collision with self
        if (i != j) 
        {
            // Obtain a visitor from the list
            Visitor* visitor2 = [visitors objectAtIndex: j];

            // Calculate it's bounding box
            CGRect visitor2rect = CGRectMake(visitor2.position.x - visitor2.size.x/2, 
                                      visitor2.position.y - visitor2.size.y/2, 
                                      visitor2.size.x, visitor2.size.y);

            // Chcek of the two bounding boxes intersect
            if ( CGRectContainsRect(visitor1rect, visitor2rect) ) {

                // Do stuff

            }

        }
    }
}
  

Комментарии:

1. Если вы инициализируете j как int j = i 1 , вы проведете вдвое меньше тестов на столкновение, и вам не придется тестировать i != j … предполагая, что вы действительно собирались использовать CGRectIntersectsRect .

2. Не знаю, как я раньше об этом не подумал. Приветствия.

Ответ №1:

Используйте CGRectIntersectsRect для вашего теста пересечения вместо «содержит», что означает что-то другое. Если это устраняет вашу проблему, я бы предположил, что отладчик просто лжет вам о том, на что visitor2 указывает — код выглядит нормально.

Комментарии:

1. Я подумал, что делаю что-то глупое вроде этого, и отладчик просто барахлит. Огромное спасибо.