iOS内存管理的一些问题
发布日期:2021-05-07 16:18:59 浏览次数:19 分类:精选文章

本文共 1318 字,大约阅读时间需要 4 分钟。

       在上一篇博文中实现了对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方法就是重新开辟内存区域,拷贝内容。而直接赋值就是浅拷贝。

上一篇:直接插入排序
下一篇:iOS模仿QQ的折叠

发表评论

最新留言

关注你微信了!
[***.104.42.241]2025年04月28日 06时44分20秒