iOS EXC_BAD_ACCESS报错及retain copy区别

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则是另外开辟一块内存。

 

最后

如果有哪里说错,欢迎各位指正。如果有疑问,可以留言,我会尽早答复。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值