认识到debug模式和断言带来的方便,我迫不及待地便将项目的schema重新设置回了debug模式
以前不懂,认为程序在发布的时候用的是release模式,为了降低发布时出现bug的几率,
便很早前就将程序设置为debug模式。
现在看来真是愚蠢之极。
不知道有多少次,我在调试bug的时候,判断空指针用了如下的代码
if(var == nil) {
NSLog(@"var==nil,fuck!");
}
浪费了多少书写时间,bug调试完毕我又得注释或者删除之。
这都是我流过的汗水,花过我的时间,证明过我曾为程序的健壮性而努力过。
删除过后,别人对我的辛劳付出一无所知。
这自然是由我不知道使用“好用的工具”所致,是一种愚蠢的行为,但这毕竟。。。
是有菜鸟进步为老鸟所必须经历的路程,不能一棒子将我打死吧?
拉回!
用了debug模式,我知道下面的方法来暴力调试更加有效率
NSAsser(var!=nil, NSLog(@"var==nil,fuck!"));
代码量不见得少了多少,或许还多了,但使用完毕之后不用再回头来擦屁股,
而且燕过有痕。。。这便是效率的提升。
而且让别人知晓,我不仅仅只是做出了功能,而且,我的功能还很健壮~
拉回,again!
ok,已经认识到debug模式和NSAssert带来的好处。
话说我已将release模式改为debug模式,原本能够正常运行的程序便卡住。
看控制台输出:
2012-03-14 14:14:11.600 GameSceneEx[26517:707] *** Assertion failure in -[CCLayer addChild:z:tag:], /Users/user/Documents/GameScene/libs/cocos2d/CCNode.m:383
2012-03-14 14:14:11.605 GameSceneEx[26517:707] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'child already added. It can't be added again'
意思很明了,有一个断言失败了。
find selected text in workspace,发现断言的相关代码为CCNode 的
-(void) addChild: (CCNode*) child z:(NSInteger)z tag:(NSInteger) aTag
{
NSAssert( child !=nil,@"Argument must be non-nil");
NSAssert( child.parent ==nil,@"child already added. It can't be added again");
if( !children_)
[selfchildrenAlloc];
[selfinsertChild:childz:z];
child.tag= aTag;
[childsetParent:self];
if(isRunning_) {
[childonEnter];
[childonEnterTransitionDidFinish];
}
}
也就是说,有一个节点在被添加的时候,他的parent成员变量已经不为 nil 了(说明他已经被添加过一次了)~
开始我没有暴力调,在上述方法里面下了个断点。
我的想法是在爆出错误的时候,在 By Thread 里面走回错误报出的上一级方法。
我如愿以偿,找到了错误抛出的上一级方法。
但是,很不幸的是xcode所提示的代码行数总会有一些出入,我被暗算好几次了~
这次我有了经验,没有在让我想不通的地方多做停留
(实际上有时候xcode所定位到出的bug抛出行数非常的不准确,稍作检查发现并无问题之后千万不要再多浪费时间)
很果断的便在bug可能出现的方法里面加了10数句 NSLog,直接便进入 暴力调试的环节了
暴力调虽然有点机械,显得蠢,但目前对我来说还是相当有效的。。
2012-03-14 14:14:11.322 GameSceneEx[26517:707] cocos2d: surface size: 960x640
2012-03-14 14:14:11.362 GameSceneEx[26517:707] 11
2012-03-14 14:14:11.366 GameSceneEx[26517:707] 22
2012-03-14 14:14:11.369 GameSceneEx[26517:707] 33
2012-03-14 14:14:11.378 GameSceneEx[26517:707] 44
2012-03-14 14:14:11.399 GameSceneEx[26517:707] 55
2012-03-14 14:14:11.414 GameSceneEx[26517:707] 66
2012-03-14 14:14:11.453 GameSceneEx[26517:707] 77
2012-03-14 14:14:11.456 GameSceneEx[26517:707] 88
2012-03-14 14:14:11.473 GameSceneEx[26517:707] 99
2012-03-14 14:14:11.476 GameSceneEx[26517:707] 10
2012-03-14 14:14:11.573 GameSceneEx[26517:707] 11
2012-03-14 14:14:11.595 GameSceneEx[26517:707] 12
2012-03-14 14:14:11.600 GameSceneEx[26517:707] *** Assertion failure in -[CCLayer addChild:z:tag:], /Users/user/Documents/GameScene/libs/cocos2d/CCNode.m:383
2012-03-14 14:14:11.605 GameSceneEx[26517:707] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'child already added. It can't be added again'
果不其然,很快我便定位到 bug 抛出的准确位置了,以下贴出 bug出现的那个方法: