Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何设置;“聪明的”;当方法返回特定值时在Xcode中设置断点?_Xcode_Debugging_Breakpoints - Fatal编程技术网

如何设置;“聪明的”;当方法返回特定值时在Xcode中设置断点?

如何设置;“聪明的”;当方法返回特定值时在Xcode中设置断点?,xcode,debugging,breakpoints,Xcode,Debugging,Breakpoints,我有一个方法,它返回一个bool值,有几个退出点。 但是,它似乎无法正常工作,因此我想设置一个自动断点,以查看它何时返回YES值,以便在调试器中检查所有变量和计算。 每当返回YES值时,我希望停止调试器 我为objc\u exception\u throw设置了一个类似的智能断点,所以我知道这是可能的,只是不确定如何设置 (如果它对任何人都有帮助,那么设置异常断点的方法是:在断点窗口(运行->显示->断点)中,输入objc\u exception\u throw作为“断点”,输入libobjc

我有一个方法,它返回一个
bool
值,有几个退出点。 但是,它似乎无法正常工作,因此我想设置一个自动断点,以查看它何时返回YES值,以便在调试器中检查所有变量和计算。 每当返回
YES
值时,我希望停止调试器

我为
objc\u exception\u throw
设置了一个类似的智能断点,所以我知道这是可能的,只是不确定如何设置


(如果它对任何人都有帮助,那么设置异常断点的方法是:在断点窗口(运行->显示->断点)中,输入
objc\u exception\u throw
作为“断点”,输入
libobjc.A.dylib
作为“位置”)

编辑:我想使用它的特定代码:

- (BOOL)collisionOccured {
    // Assumption: helicopter is of square shape (collision calculated by radius), walls are rectangles
    // This approach is based on the solution seen here: http://stackoverflow.com/questions/401847/circle-rectangle-collision-detection-intersection/402010#402010

    float helicopterImageWidth = [helicopter texture].contentSize.width;
    float wallImageWidth = [[walls lastObject] texture].contentSize.width;
    float wallImageHeight = [[walls lastObject] texture].contentSize.height;
    float helicopterCollisionRadius = helicopterImageWidth * 0.4f;

    CGPoint helicopterPosition = helicopter.position;


    int numWalls = [walls count];
    for (int i = 0; i < numWalls; i++) {
        CCSprite *wall = [walls objectAtIndex:i];

        if ([wall numberOfRunningActions] == 0) {
            // The wall is not moving, we can skip checking it.
            continue;
        }

        CGPoint wallPosition = wall.position;

        float helicopterDistanceX = abs(helicopterPosition.x - wallPosition.x - wallImageWidth/2);
        float helicopterDistanceY = abs(helicopterPosition.y - wallPosition.y - wallImageHeight/2);

        if (helicopterDistanceX > (wallImageWidth/2 + helicopterCollisionRadius)) { return NO; }
        if (helicopterDistanceY > (wallImageHeight/2 + helicopterCollisionRadius)) { return NO; }

        if (helicopterDistanceX <= (wallImageWidth/2)) { return YES; }
        if (helicopterDistanceY <= (wallImageHeight/2)) { return YES; }

        float cornerDistance_sq = powf((helicopterDistanceX - wallImageWidth/2), 2) + 
                                powf((helicopterDistanceY - wallImageHeight/2), 2);

        return (cornerDistance_sq <= powf(helicopterCollisionRadius, 2));
    }

    // this should not occur
    return NO;
}
问题是update方法将delta(时间流逝)作为参数,因此我无法逐帧检查正在发生的事情——每当我继续执行时,我都会看到不同的场景


(我在代码中使用cocos2d)

如果您使用的是本地返回变量:

- (BOOL)someMethod {
   BOOL ret = NO;
   if (something) {
      ret = YES;
   } else if (something_else) {
      ret = YES;
   }
   // ... and so on
   return ret;
}
您只需在
ret

否则,您可能需要单步执行代码,希望一些巧妙的条件断点组合可以帮助您不必在每次调用时中断。像使用
objc\u exception\u throw
那样设置方法断点是行不通的,因为它会在每次调用时停止,在调用站点中断返回值已经太晚了,无法弄清楚您是如何到达那里的


如果您可以发布代码,我们可能能够提供关于调试策略的更具体的帮助。祝你好运。:-)

您可以设置条件断点。稍微调整一下
更新:

- (void)update:(ccTime)delta {
     BOOL collided = [self collisionOccured];
     if (collided) {
        NSLog(@"A collision occured");
    }
}

您可以在
BOOL
赋值后将断点设置为正常(即在
if
行上),然后右键单击蓝色断点箭头并选择“显示消息气泡”,并添加
collide
作为条件。额外变量应该在发布构建模式下得到优化。

您还可以通过运行->停止Objective-C异常切换objc_异常抛出断点
- (void)update:(ccTime)delta {
     BOOL collided = [self collisionOccured];
     if (collided) {
        NSLog(@"A collision occured");
    }
}