如何设置;“聪明的”;当方法返回特定值时在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");
}
}