Странное поведение с локальными переменными в Objective-C - PullRequest
0 голосов
/ 12 ноября 2011

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

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

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

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

Проверка столкновения почти никогда не достигается, когда объекты на экране находятся на коленях.

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

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

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

Вот мой код:

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 Ответ

1 голос
/ 12 ноября 2011

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

...