iOS EXC_BAD_ACCESS报错
今天客户的项目中遇到了EXC_BAD_ACCESS的报错,网上稍微搜了一下,大概率是因为内存地址问题。
1. 问题分析
废话不多说,先上图!
从图中红字报错的指令看,应该是指针指向这个地址时发现该内存地址无法访问,意味着某个对象在这之前已经被销毁释放了,现在指针去引用自然就报错了。
错误的函数在我提供的sdk中,于是客户蹭蹭蹭地找上门了!
2. 解决问题
由于是客户项目搭载了我的sdk,只能和客户一起分析排查。
报错具体位置是蓝框选中的函数,戳进去分析了一通,猜测是函数中某个NSString参数的问题导致的。
客户使用nil或者@""都不会引发错误,但是使用变量赋值时,就报错了。
最后客户把retain属性的变量改为copy,再赋值给我的参数,问题就解决了。
简单说一下retian和copy的区别,retain是把内存地址的指针赋值给对象,而copy是另开辟一块内存并把值存进去。举个简单的例子:
// 有如下一个变量a,它的内存地址是0x1111
@property(retain,nonatomic) NSString* a;
// 现在我把a赋值给一个变量b,那么b的指针访问的仍是0x1111
NSString* b = a;
如上图所示,retain属性的变量当它的计数器为0时,被释放销毁,这时再访问b就会报错了。
// 这次属性改为copy,变量的地址仍是0x1111
@property(copy,nonatomic) NSString* a;
// 把a赋值给b,这时b的地址则可能是0x2222,但它的值和a相同
NSString* b = a;
而copy则是另外开辟一块内存。
最后
如果有哪里说错,欢迎各位指正。如果有疑问,可以留言,我会尽早答复。