我有一个返回bool
值的方法,有几个退出点。
但是,它似乎无法正常工作,所以我想设置一个自动断点来查看它何时返回YES值,这样我就可以检查调试器中的所有变量和计算。
我想在返回YES
值时停止调试器。
我为objc_exception_throw
设置了类似的智能断点,所以我知道这是可能的,我只是不确定如何。
(如果它可以帮助任何人,你可以设置异常断点的方式:在Breakpoints窗口(Run - > Show - > Breakpoints)中输入objc_exception_throw
作为“断点”,并{{1} }作为“位置”)
编辑:我想用它的具体代码:
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;
}
问题是更新方法需要- (void)update:(ccTime)delta {
if ([self collisionOccured]) {
NSLog(@"A collision occured");
}
}
(时间过去)作为参数,所以我无法逐帧检查发生了什么 - 每当我继续执行时,我会看到一个不同的场景。
(我在代码中使用cocos2d)
答案 0 :(得分:1)
您可以设置条件断点。略微调整到update:
- (void)update:(ccTime)delta {
BOOL collided = [self collisionOccured];
if (collided) {
NSLog(@"A collision occured");
}
}
您可以在BOOL
分配后(即在if
行)正常设置断点,然后右键单击蓝色断点箭头并选择“显示消息气泡”,并且添加collided
作为条件。额外变量应该在Release构建模式中进行优化。
答案 1 :(得分:0)
如果您使用的是本地返回变量:
- (BOOL)someMethod {
BOOL ret = NO;
if (something) {
ret = YES;
} else if (something_else) {
ret = YES;
}
// ... and so on
return ret;
}
您只需在ret
否则,您可能会坚持使用代码 - 希望条件断点的一些巧妙组合将帮助您不必在每次调用时中断。像使用objc_exception_throw
一样设置方法断点是行不通的,因为它会在每次调用时停止,并且在调用站点上打破返回值为时已晚,无法确定如何到达那里。
如果您可以发布代码,我们可以为调试策略提供更具体的帮助。祝好运。 : - )