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

iOS- 再谈ARC里内存问题,ARC里数组、对象内存得不到释放?的更多相关文章

  1. java中的内存划分和一个数组的内存图

    内存概述 内存是计算机中的重要原件,临时存储区域,作用是运行程序.我们编写的程序是存放在硬盘中的,在硬盘中的程序是不会运行的,必须放进内存中才能运行,运行完毕后会清空内存   Java虚拟机要运行程序 ...

  2. iOS 再谈 代理传值,block反向传值

    本贴的例子是:有A和B两个界面,要实现的效果就是先让A跳转到B,然后B中有个颜色的参数,当B跳转到A时,把这个颜色的参数传递给A,在A中利用这个颜色改变自己界面的颜色. 第1步:在发送者(界面B)中, ...

  3. 浅谈JavaScript和DOM中的类数组对象

    JavaScript是一门弱类型语言,它的数据类型分为两大类:简单数据类型(5种:Undefined.Null.Boolean.Number.String)和复杂数据类型(1种:Object).Obj ...

  4. Objective-C:ARC自动释放对象内存

    ARC是cocoa系统帮你完成对象内存释放的引用计数机制 .h文件 // Person.h // 01-ARC // // Created by ma c on 15/8/13. // Copyrig ...

  5. JVM-对象及对象内存布局

    目录 前言 类与对象 对象类二分模型 对象 对象内存布局 JOL工具 对象头 Mark Word 类型句柄 对象头与锁膨胀 无锁 偏向锁 轻量级锁 重量级锁 重量级锁降级 实例数据 填充 对象生命周期 ...

  6. 深入理解JVM(4)——对象内存的分配策略

    一.Java所承担的自动内存管理主要是针对对象内存的分配和回收. 二.在Java虚拟机的五块内存空间中,程序计数器.Java虚拟机栈.本地方法栈内存的分配和回收都具有确定性,一般在编译阶段就能确定需要 ...

  7. java 基础概念 -- 数组与内存控制

    问题1: Java在声明数组的过程中,是怎样分配内存的? 在栈内存中 建一个数组变量,再在堆内存中 建一个 数组对象.至于详细的内存分配细节,还得看 该初始化是 数组动态初始化 还是 数组静态初始化. ...

  8. Java数组以及内存分配

    Java数组以及内存分配 什么数组(简) 数组初始化 动态初始化 静态初始化 内存分配问题(重) 数组操作的两个常见小问题 什么是数组: 定义格式: 数组类型 [] 数组名 ; 如:常用格式,其他方式 ...

  9. 05-02 Java 一维数组、内存分配、数组操作

    数组的定义 动态初始化 /* 数组:存储同一种数据类型的多个元素的容器. 定义格式: A:数据类型[] 数组名; B:数据类型 数组名[]; 举例: A:int[] a; 定义一个int类型的数组a变 ...

  10. [Java基础] Java对象内存结构

    转载地址:http://www.importnew.com/1305.html 原文于2008年11月13日 发表, 2008年12月18日更新:这里还有一篇关于Java的Sizeof运算符的实用库的 ...

随机推荐

  1. HBase的详细安装部署

    一.部署 1.Zookeeper正常部署,并且启动 2.Hadoop正常部署,并且启动 3.Hbase的解压 解压HBase到指定目录 tar -xvf  /HBase.tar.gz -C /airP ...

  2. STM32 HAL库学习系列第6篇---定时器TIM 级联配置

    应用情景 使用定时器配置编码器模式,发现STM32只有两个定时器是32位,16位的测量值不够用,发现是可以使用两个16位定时器级联为32位的. 我是在使用编码器计数电机转速时使用,但是最终实现的效果不 ...

  3. python自学之第一章——列表(一)

    1.列表是什么? 列表[list]:列表是由一系列特定顺序排列的元素组成. 列表由[]表示 eg: a = ['jackal','jax';'jack','jeef','jacky'] print(a ...

  4. python教程(零)·前言

    本教程是作者根据自己学习python的经验写下的,一来是想将经验分享给对python同样感兴趣的小白(大神请忽略),二来是想借此加深本人对python的理解,温故而知新. 学习基础 本教程面向的读者, ...

  5. Codeforces #123D: 后缀数组+单调栈

    D. String     You are given a string s. Each pair of numbers l and r that fulfill the condition 1 ≤  ...

  6. Python3 break与continue

    Infi-chu: http://www.cnblogs.com/Infi-chu/ break和continue都是中断循环的意思,但是他们的中断后的效果不同. 请看如下两个例子就懂了 ''' 这个 ...

  7. day 13 字典dict 操作

    1.len   键值对的个数 In [4]: nums = [11,22,33] In [6]: len(nums) Out[6]: 3 In [7]: infor = {"name&quo ...

  8. ios 9.1以后 添加libz.dylib 方法

    1. 进入你项目的build phases 2.点击+号在弹出的对话框选择addother 3.在弹出的对话框中输入"cmd"+"shift"+"g& ...

  9. 【Windows定时关机】windows实现定时关机与取消

    背景:本人昨晚本来打算将电脑设置为晚上12点 30定时关机,结果写成了:12:30,所以就在刚才,我正玩游戏的时候, 电脑弹出提示:“windows将在一分钟内关闭”,我刚开始一脸懵逼,后来打开昨天敲 ...

  10. JavaWeb(十七)——JSP中的九个内置对象

    一.JSP运行原理 每个JSP 页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理.JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet ...