0

我在objective-c的嵌套for循环中观察到局部变量的一些奇怪行为。

下面的代码循环通过一个称为访问者的 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

            }

        }
    }
}
4

1 回答 1

1

用于CGRectIntersectsRect您的交叉测试而不是“包含”,这意味着不同的东西。如果这样可以解决您的问题,我猜调试器只是在向您撒谎,因为它visitor2指向的东西 - 代码看起来不错。

于 2011-11-12T00:30:48.180 回答