首页 > 学院 > 开发设计 > 正文

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

2019-11-14 18:52:21
字体:
来源:转载
供稿:网友

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.VEVb.com/qingche/
本文版权归作者和博客园共有,欢迎转载,但必须保留此段声明,且在文章页面明显位置给出原文连接。

 

 

 

 

 

 

 

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表