首页 技术 正文
技术 2022年11月6日
0 收藏 740 点赞 1,033 浏览 1850 个字

1.前言  

     本来以为在改成ARC以后,不再需要考虑内存问题了,可是在实践中还是发现有一些内存问题需要注意,今天我不谈block的循环引用的问题,主要说说一些对象、数组不内存得不到释放的情况. 

2.数组内存得不到释放的情况  

//组织字典数据
- (NSMutableDictionary *)setupDicData{ NSMutableDictionary *dict = [NSMutableDictionary dictionary];
for (int i = 0; i <= 30; i++) { [dict setObject:[self setupArrayData] forKey:[NSString stringWithFormat:@"%d%@",i,@"class"]];
}
return dict;
}//组织数组数据
- (NSMutableArray *)setupArrayData{ NSMutableArray *marry = [NSMutableArray array]; for (int i = 0; i<=30; i++) { NSString *s = [NSString stringWithFormat:@"%@",@"data-test"]; [marry addObject:s]; }
return marry;
}

运行+——

- (void)viewDidLoad {    [super viewDidLoad];    while (true) {        //30.0定时执行        [NSThread sleepForTimeInterval:30.0];        NSDictionary *dict = [self setupDicData];        NSLog(@"%@",dict);
//每次数据内存都得不到释放 }
}

 //按上代码传递数组执行,每次数组、对象内存都得不到释放。如图:iOS- 再谈ARC里内存问题,ARC里数组、对象内存得不到释放?内存会无线的往上增加,直至崩溃。  

2.是什么原因导致这种内存得不到释放的?  

 主要是你在iOS里使用    while (true) {} 无线循环时,iOS ARC默认认为你这个方法永远没有执行完,所以不会去主动释放你方法里的对象,这一点和JAVA不一样,所以很多JAVA开发者转iOS后习惯性的使用while(true){}导致项目里存在这种内存隐患,导致内存无限增加。

3.如何解决这种数组传递内存得不到释放的情况?  

解决方法一:

3.1.最简单最直接在ARC的环境下使用        @autoreleasepool {}  

//@autoreleasepool {}的作用是在每次循环一次,都会把内存主动释放掉- (void)viewDidLoad {    [super viewDidLoad];    while (true) {        @autoreleasepool {
//30.0定时执行 [NSThread sleepForTimeInterval:30.0]; NSDictionary *dict = [self setupDicData]; NSLog(@"%@",dict);
//每次数据内存都得不到释放
}
}
}

 内存图,我们发现很稳定,每次都会主动将内存释放 iOS- 再谈ARC里内存问题,ARC里数组、对象内存得不到释放? 解决方法二:

3.2.使用NSTimer来做数组传递的无限循环,ARC会自动帮你释放内存  

- (void)usingDatadosomething{    //30.0定时执行    [NSThread sleepForTimeInterval:0.10];    NSDictionary *dict = [self setupDicData];    NSLog(@"%@",dict);
//每次数据内存都得不到释放}- (void)viewDidLoad { [super viewDidLoad]; [NSTimer scheduledTimerWithTimeInterval:30.0 target:self selector:@selector(usingDatadosomething) userInfo:self repeats:YES]; [[NSRunLoop currentRunLoop] run];}

内存图如下

iOS- 再谈ARC里内存问题,ARC里数组、对象内存得不到释放?

解决方法三:

3.3.使用block封装数组传递,最后做block的释放,ARC会自动帮你释放内存  

block使用较为频繁,不在本文章阐述,下次会专门写一篇block的博客。谢谢大家,还有什么疑问可以评论中提出,我有时间会耐心回复!  作者: 清澈Saup
出处:http://www.cnblogs.com/qingche/
本文版权归作者和博客园共有,欢迎转载,但必须保留此段声明,且在文章页面明显位置给出原文连接。 

上一篇: HDU 5636 Shortest Path
下一篇: HDU 2156 分数矩阵
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,488
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,903
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,737
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,489
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:8,128
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:5,290