iOS- 再谈ARC里内存问题,ARC里数组、对象内存得不到释放?
2015-06-11 18:19
621 查看
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); //每次数据内存都得不到释放 } }
//按上代码传递数组执行,每次数组、对象内存都得不到释放。如图:
内存会无线的往上增加,直至崩溃。
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); //每次数据内存都得不到释放 } } }
内存图,我们发现很稳定,每次都会主动将内存释放
解决方法二:
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]; }
内存图如下
解决方法三:
3.3.使用block封装数组传递,最后做block的释放,ARC会自动帮你释放内存
block使用较为频繁,不在本文章阐述,下次会专门写一篇block的博客。谢谢大家,还有什么疑问可以评论中提出,我有时间会耐心回复!
作者: 清澈Saup
出处: http://www.cnblogs.com/qingche/ 本文版权归作者和博客园共有,欢迎转载,但必须保留此段声明,且在文章页面明显位置给出原文连接。
相关文章推荐
- IBokan_ios80_自学系列_1(switch语句+if...else...语句练习)
- 正则表达式在IOS开发中的应用
- ios毛玻璃效果
- ios多语言设置,操作
- iOS 系统相机的调用
- IOS-视频播放
- ios中Raw文件系统常用文件夹
- iOS内存管理
- iOS8 设置tableView的分割线
- Masonry介绍与使用实践 - iOS移动开发周报(转)
- 使用svn删除Xcode工程中的文件
- iOS NSArray API集合
- 【iOS】苹果,百度Map定位使用与总结
- iOS 使用百度地图地图画成功了,但是没有图层显示问题解决。
- iOS越狱环境开发
- iOS开发之CGPoint、CGSize、CGRect、CGRectMake、window(窗口)、视图(view)
- iOS 枚举类型
- 【iOS】网页中调用JS与JS注入
- 关于iOS Tabbar的一些设置
- ios8 Xcode6 设置Launch Image 启动图片