
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方法就是重新开辟内存区域,拷贝内容。而直接赋值就是浅拷贝。