Objective-C中局部变量的奇怪行为

时间:2011-11-12 00:26:08

标签: objective-c cocos2d-iphone local-variables

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

下面的代码循环遍历一个名为visitor的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 个答案:

答案 0 :(得分:1)

使用CGRectIntersectsRect进行交叉点测试而不是“包含”,这意味着不同的东西。如果这可以解决您的问题,我猜测调试器只是向您说谎visitor2指向的东西 - 代码看起来很好。