iOS内存管理的一些问题

10 篇文章 0 订阅
2 篇文章 0 订阅

       在上一篇博文《iOS模仿QQ的折叠》中实现了对tableView的动画折叠效果该Demo使用的是ARC,后来突发奇想,将其改为MRC,问题不断。总结如下:

问题1.在从可变数组取值时卡死

解答:该问题是因为_dataArr的引用计数为0所引起的,看看我们的定义语句

    _dataArr = [NSMutableArray arrayWithCapacity:0];


当我们在点击事件中使用时,它的引用计数为0所以卡死,那么为何ARC下没有问题呢?那是因为ARC下系统会为我们自动加一句retain,引用计数不为0,所以就能跨方法使用了。系统是很聪明的,其实这也就是MRC和ARC的区别,MRC下我们使用对象时自己retain、release。而在ARC下系统为我们添加了retain、releas。也就是ARC下系统决定retain和release是否添加及其添加位置。MRC下都是我们管理的。

改正方法:

1.用alloc方法

 _dataArr = [[NSMutableArray alloc]initWithCapacity:0];

2 .使用retain方法,使得引用计数+1

    _dataArr = [[NSMutableArray arrayWithCapacity:0]retain];

问题 2.MRC下从_dataArr 里面取出的字典,再改变字典的value后,不再影响_dataArr。

原语句如下:

    NSMutableDictionary *dic = [_dataArr objectAtIndex:btn.tag-100];
    NSNumber *number = [dic objectForKey:GROUP_STATE];
    if ([number boolValue])
    {
        [dic setObject:[NSNumber numberWithBool:NO] forKey:GROUP_STATE];
    }
    else
    {
        [dic setObject:[NSNumber numberWithBool:YES] forKey:GROUP_STATE];
    }
因为程序在此卡住,想了一些解决方法,将_dataArr用alloc方法初始化,又担心内存管理问题,所以将上述代码也做了改动。改动如下

    NSMutableDictionary *dic = [[NSMutableDictionary alloc]initWithDictionary: [_dataArr objectAtIndex:btn.tag-100]];


改动后程序用运行,但折叠效果没有了,也就是后面dic的改变没有影响_dataArr,为何?

解答:这牵扯到深浅拷贝的问题,浅拷贝就是拷贝一个指针,两个对象指向同一片内存,一个改变时另一个也改变。深拷贝是拷贝内容,就是将内存里面的内容拷贝到另一个对象,这样,当一个改变时另一个不会改变。简单的说,浅拷贝就相当你的影子,你变它也变,而深拷贝则是你的克隆,你变,它不一定变。

alloc方法就是重新开辟内存区域,拷贝内容。而直接赋值就是浅拷贝。




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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值