博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS 有关内存管理的一个错误分析
阅读量:4588 次
发布时间:2019-06-09

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

今天遇到一个错误,定义了一个全局NSMutableArray *arry;

- (void)viewDidLoad{    NSLog(@"viewDidLoad");    [super viewDidLoad];    self.navigationItem.title = @"familyName";   //arry = [[NSMutableArray arrayWithCapacity:5]retain];    arry = [[NSMutableArray alloc] init];    MyCellContent *content0 = NEWCELLCOTENT(@"0.png",@"0000");    MyCellContent *content1 = NEWCELLCOTENT(@"1.png",@"1111");    MyCellContent *content2 = NEWCELLCOTENT(@"0.png",@"1111");         MyCellContent *content3 = NEWCELLCOTENT(@"1.png",@"1111");    MyCellContent *content4 = NEWCELLCOTENT(@"0.png",@"1111");    [arry addObject:content0];    [arry addObject:content1];    [arry addObject:content2];    [arry addObject:content3];    [arry addObject:content4];}

后面用到它

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{    //尝试从重用队列中取出一个cell,如果返回nil,就要重新创建一个    static NSString *CellIdentifier = @"BaseCell";    MyCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];    if(!cell)    {        cell = [[MyCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];    }           [cell fillCell:[arry objectAtIndex:indexPath.row]];    return cell;}

运行时完全正常,但是当把cell滑出可视范围时,就会崩溃。看调试信息,得知arry:0 object,arry 居然是空的!

思考:我明明定义的是全局的、又添加进了object,这里arry为什么会为空了?

求问于前辈,得知犯了明显的内存管理的错误。上面的代码是已经修改过的代码。

我原本是这样定义arry的:arry = [[NSMutableArray arrayWithCapacity:5];没有加retain。

这样导致的问题就是:非采用new,alloc,copy创建的对象,系统会自动把它设为autorelease。

当这个对象所在的方法执行完后,系统就会在某一不确定的时间release掉arry对象,所以我们得到的arry为空。

 

汲取教训:在ios开发中,尽量采用new,alloc,copy创建的对象,不要用系统会自动autorelease的对象。

              如果非要用别的方式创建对象,那么,请一定加上retain。并注意用完后,要自己写release。

              推荐:arry = [[NSMutableArrayalloc] init];

              不推荐:arry = [[NSMutableArray arrayWithCapacity:5]retain];

              会导致错误的: arry = [[NSMutableArray arrayWithCapacity:5];

转载于:https://www.cnblogs.com/wyqfighting/p/3171952.html

你可能感兴趣的文章
并发编程学习笔记(3)----synchronized关键字以及单例模式与线程安全问题
查看>>
2-9
查看>>
python多线程(一)
查看>>
MindManager中读图工具的使用
查看>>
利用GridView 插入、删除、修改、分页的综合实例代码---转!!!
查看>>
2016年3月11日Android学习日记
查看>>
Android弹出Toast工具类总结
查看>>
吴恩达机器学习笔记(十) —— 推荐系统
查看>>
Linux下Ant安装与配置
查看>>
实验二 用机器指令和汇编指令编程
查看>>
大数据系列之kafka监控kafkaoffsetmonitor安装
查看>>
常用正则表达式
查看>>
Java基础知识
查看>>
Identity Server4学习系列三
查看>>
我的一些学习资源
查看>>
第二届i春秋挖洞大赛的一些感想
查看>>
YAML 语言教程
查看>>
ios开发之C语言基础
查看>>
Cocos Console命令总结
查看>>
网页回到顶部 GoTop 按钮自动隐藏
查看>>