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


    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/
    本文版权归作者和博客园共有,欢迎转载,但必须保留此段声明,且在文章页面明显位置给出原文连接。
     
  • 相关阅读:
    d3操作svg路径动画,及dom移动
    新时代前端必备神器 Snapjs之弹动效果
    threejs 鼠标移动控制模型旋转
    玩转SVG线条动画
    CSS也能计算:calc
    CSS两种盒子模型:cntent-box和border-box
    解决Jquery中click里面包含click事件,出现重复执行的问题
    区块链踩坑之基础扫盲及搭建以太坊网络私有链(单节点)
    微信朋友圈转发第三方网站带缩略图实现
    物流一站式查询之快递100篇
  • 原文地址:https://www.cnblogs.com/qingche/p/4569833.html
Copyright © 2020-2023  润新知