首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > Access >

解决 EXC_BAD_ACCESS 异常

2012-09-23 
解决 EXC_BAD_ACCESS错误出现?EXC_BAD_ACCESS ?错误,给你的错误提示就这个,如何根本没法知道哪里错误了,其

解决 EXC_BAD_ACCESS 错误

出现?EXC_BAD_ACCESS ?错误,给你的错误提示就这个,如何根本没法知道哪里错误了,其实还是有方法知道的,

做如下设置:

Project -> Edit active executable ->Argument?

添加如下四个参数

NSDebugEnabled

NSZombieEnabled

MallocStackLogging?

MallocStackLoggingNoCompact

并都设置为YES。具体如下图:

解决 EXC_BAD_ACCESS  异常?

??这个时候,如果有如下一段代码:

?//重复释放一个变量?

??NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];

??NSData* data = [NSData dataWithBytes:"asklaskdxjgr" length:12];

??[data release];

??[pool release];

再Debug窗口会有如下的提示

???2003-03-18?13:01:38.644?autoreleasebug[3939]?***?***?Selector?'release'

??sent?to?dealloced?instance?0xa4e10?of?class?NSConcreteData.

?

虽然也能大致判断是哪种类型的变量重复释放了,但信息还不够多,当项目大,源码比较多的时候,也不太方便定位,

在console窗口运行如下命令可以得到更多信息:shell?malloc_history <pid> <address>"

?输入命令:shell?malloc_history 3939 0xa4e10

?就会出现更多的信息:

??[dave@host193 Frameworks]$ malloc_history 3939 0xa4e10

??Call [2] [arg=32]: thread_a0000dec |0x1000 | start | _start | main |

??+[NSData dataWithBytes:length:] | NSAllocateObject | object_getIndexedIvars |

??malloc_zone_calloc??

这个时候就知道具体哪个函数出先问题了,从这里可以看到main里NSData出现问题了。?

?

2. NSArray等集合类的实用问题。

   ? ?如下面的代码???

?? ? ? ?ReleaseTest* rt = [[alloc]?init];

NSMutableArray?*array = [[NSMutableArray?alloc]?init] ;

[array?addObject: rt];

ReleaseTest?*rt2 = [array?objectAtIndex:0];

  ?  ?[rt2?release];???

[array?release];

[rt?release];?

?? ? 就会导致重复释放内存问题,因为rt2,获取的是一个对象的指针,如果已经释放了的话,rt在释放的话,就重复了,为了遵循谁Init谁Release的原则,rt2就不应该Release。

?

3. init 和 Release 的问题。

?? ?凡是对象通过Init的方法生成的对象,都需要自己负责Release。

?? ?凡不是通过Init的方法生成的对象,不需要负责Release.如[NSString StringWithFormat]方法生成的对象就不需要自己Release,因此自己定义函数,返回一个类的时候,一定要设置为autoRelease?。这样调用的人就不用操心是否需要释放对象了。

?4. AutoReleasePool里最好不要将AutoRelease对象赋值给其它对象,否则离开这个作用域后,对象将会Release掉。

热点排行