对付EXC_BAD_ACCESS的再一次胜利——暴力调试法

一波未平,一波又起,这不,下午继续开发进度的时候,又遇到了新的问题:

// ************************************************************************************

一。CCSprite 明明设置了rotation属性之后才加入CCNode,但是就时开不出来有任何的角度偏转!!!

找了个把小时,才惊奇的发现:原来CCSprite的 rotation 设置的是 “顺时针” 的 “角度值”!!

悲催外加震撼,不过好在还是解决了这个问题,这个让人匪夷所思的问题!!值得一提的是:

box2d里面的 b2Body 的 angle 设置的是 “逆时针” 的 “弧度值”!!这就是为什么这个问题拖我这么久的根本原因啊~

想象 1。57如果表示的是弧度值,那么东西就转动了90度,但是。。。。

如果这个1。57表示的仅仅是角度值,你说1个东西转动了1。57的角度,你光凭肉眼能不能发现?!

答案是不能,总之,我就是没法现(当然也是有原因的,物体在屏幕中很小,那么点儿角度偏转根本就没区别)~

结论:

box2d:逆时针 + 弧度值 + angle

cocos2d:顺时针 + 角度值 + rotation

另外,cocos2d框架提供了很方便的角度和弧度相互转换的宏

CC_DEGREES_TO_RADIANS(): 这个可以用来将角度转换成弧度~

CC_RADIANS_TO_DEGREES(): 这个可以用来将弧度转换成角度~


二。GameScene dealloc的时候报出错误!!!导致在退出游戏后再进入游戏的时候出错,不过之后第二次进入可以成功!

先上代码,之后再慢慢做分析:

这个是 GameScene 的 dealloc 方法

// on "dealloc" you need to release all your retained objects
- (void) dealloc {
	// 1.if the object extends CCNode, you needn't care how to free the heap space(dynamic allocated memmery-space)
	// 2.if the object is contained by objective-c_baseclass_framework, free heapspace by "[*** dealloc];"
	// 3.if the object comes from box2d(writing in C++), free heapspace by "delete ****;"
	delete _world;
	_world = NULL;	
	NSLog(@"delete _world successfully!!");
	
	delete _m_debugDraw;
	_m_debugDraw = NULL;
	NSLog(@"delete _m_debugDraw successfully!!");
	
	// below is the second case! since the CCSpriteBatchNode extends CCNode,
	// there is no need to dealloc it! so, below is no neccessary!
//	[_testBatch dealloc];
//	[_eleBallBatch dealloc];
//	[_eleBoxBatch dealloc];
	
	// below is the third case!
	[_spriteContainer dealloc];
	NSLog(@"dealloc _spriteContainer successfully!!");
	
	[_eleBallContainer dealloc];
	NSLog(@"dealloc _eleBallContainer successfully!!");
	
	[_shapes dealloc];
	NSLog(@"dealloc _shapes successfully!!");
	
	// don't forget to call "super dealloc"
	[super dealloc];
	NSLog(@"dealloc super successfully!!");	
}

这个是   ToolBar 类的 dealloc 方法(之后会说到问题就是出现在这里!)

-(void) dealloc {
	NSLog(@"enter  ToolBar's dealloc method");
//	[_shapes dealloc];
	NSLog(@"enter  ToolBar's dealloc method2");
	[super dealloc];
	NSLog(@"will leave ToolBar's dealloc method");
}

ToolBar 继承自 CCNode 类

(凡继承自CCNode的类都不用显式的去调用 dealloc 方法,Scene 级别的对象会在dealloc的时候自动调用继承自CCNode对象的 dealloc方法)

ToolBar 是 GameScene的一个成员变量,如上所述,因为其继承自 CCNode 类,所以没有在 GameScene的 dealloc方法中调用其 dealloc 方法~

接下来我会贴出控制台打印出的报错信息,你会发现我说的都是对的,因为虽然我没有显式地去掉用 ToolBar的dealloc 方法,但该方法中的

CCLog()确实输出了一些不可磨灭的东西!真理万岁~

下面是控制台的报错输出(当然我只是检重要的东西贴一下)

2011-08-13 21:26:44.066 SuperBalance1.1[6652:307] cocos2d: Frame interval: 1
2011-08-13 21:26:44.096 SuperBalance1.1[6652:307] cocos2d: surface size: 320x480
2011-08-13 21:26:45.850 SuperBalance1.1[6652:307] ccTouchesEnded
2011-08-13 21:26:46.168 SuperBalance1.1[6652:307] ccTouchesEnded
2011-08-13 21:26:46.456 SuperBalance1.1[6652:307] ccTouchesEnded
2011-08-13 21:26:46.726 SuperBalance1.1[6652:307] ccTouchesEnded
2011-08-13 21:26:46.998 SuperBalance1.1[6652:307] ccTouchesEnded
2011-08-13 21:26:47.225 SuperBalance1.1[6652:307] ccTouchesEnded
2011-08-13 21:26:47.494 SuperBalance1.1[6652:307] ccTouchesEnded
2011-08-13 21:26:47.814 SuperBalance1.1[6652:307] ccTouchesEnded
2011-08-13 21:26:48.143 SuperBalance1.1[6652:307] ccTouchesEnded
2011-08-13 21:26:48.428 SuperBalance1.1[6652:307] ccTouchesEnded
2011-08-13 21:26:50.470 SuperBalance1.1[6652:307] delete _world successfully!!
2011-08-13 21:26:50.480 SuperBalance1.1[6652:307] delete _m_debugDraw successfully!!
2011-08-13 21:26:50.491 SuperBalance1.1[6652:307] dealloc _spriteContainer successfully!!
2011-08-13 21:26:50.502 SuperBalance1.1[6652:307] dealloc _eleBallContainer successfully!!
2011-08-13 21:26:50.513 SuperBalance1.1[6652:307] dealloc _shapes successfully!!
2011-08-13 21:26:50.523 SuperBalance1.1[6652:307] enter  ToolBar's dealloc method
Program received signal:  “EXC_BAD_ACCESS”.
(gdb) 

从上面所报错的错误可以十拿九稳的推断,是 ToolBar 类 dealloc 方法中的 "[_shapes dealloc];"这行代码出现了问题~

为什么会出问题了,_shapes 是一个 NSMutabeArray 类型的数据,我在init方法中对其做了初始化,那我肯定要在该对象不再

被用到的时候将这个_shapes对象也给 dealloc 掉!这是天经地义的啊,但是为什么会报错呢?

经过我的良久沉思,终于发现了其中的问题,因为 _shapes 同时也是 GameScene 中的一个成员变量,

换句话说,我是在 GameScene 的某个方法中在堆内存上分配出该对象的,之后,我又通过调用 ToolBar 的 setShapes 方法,

将GameScene 中的_shapes成员变量赋予到 Toolbar 对象的成员变量。。。

其间并没有新的堆内存的分配,所以说,GameScene 和 ToolBar 中的 _shapes 成员变量指向的都是同一块儿堆内存。。。

这就导致了以上问题的出现!!!

其实某次查看报错结果的时候我也偶然发现爆出过这样一则信息:

真的是可遇而不可求,这个报错信息怎么搞也整不出来了,不过大意是这样的:

************** 您所要求dealloc的对象根本就未曾被初始化...EXC_BAD_ACCESS!! **************

哎~貌似XCode 就知道 EXC_BAD_ACCESS,现在我看到这个就烦了,每次都是这个错误,搞地人脑袋云里雾里的~

不过很奇怪的是,为什么竟然只会报出一次,后面却又看不见了,很诡异!!

总之,问题能够得到圆满地解决还是很好的!!

你可能感兴趣的:(object,xcode,delete,Access,Signal,Shapes)