iOS- 再谈ARC里内存问题,ARC里数组、对象内存得不到释放?
1.前言
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.是什么原因导致这种内存得不到释放的?
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会自动帮你释放内存
iOS- 再谈ARC里内存问题,ARC里数组、对象内存得不到释放?的更多相关文章
- java中的内存划分和一个数组的内存图
内存概述 内存是计算机中的重要原件,临时存储区域,作用是运行程序.我们编写的程序是存放在硬盘中的,在硬盘中的程序是不会运行的,必须放进内存中才能运行,运行完毕后会清空内存 Java虚拟机要运行程序 ...
- iOS 再谈 代理传值,block反向传值
本贴的例子是:有A和B两个界面,要实现的效果就是先让A跳转到B,然后B中有个颜色的参数,当B跳转到A时,把这个颜色的参数传递给A,在A中利用这个颜色改变自己界面的颜色. 第1步:在发送者(界面B)中, ...
- 浅谈JavaScript和DOM中的类数组对象
JavaScript是一门弱类型语言,它的数据类型分为两大类:简单数据类型(5种:Undefined.Null.Boolean.Number.String)和复杂数据类型(1种:Object).Obj ...
- Objective-C:ARC自动释放对象内存
ARC是cocoa系统帮你完成对象内存释放的引用计数机制 .h文件 // Person.h // 01-ARC // // Created by ma c on 15/8/13. // Copyrig ...
- JVM-对象及对象内存布局
目录 前言 类与对象 对象类二分模型 对象 对象内存布局 JOL工具 对象头 Mark Word 类型句柄 对象头与锁膨胀 无锁 偏向锁 轻量级锁 重量级锁 重量级锁降级 实例数据 填充 对象生命周期 ...
- 深入理解JVM(4)——对象内存的分配策略
一.Java所承担的自动内存管理主要是针对对象内存的分配和回收. 二.在Java虚拟机的五块内存空间中,程序计数器.Java虚拟机栈.本地方法栈内存的分配和回收都具有确定性,一般在编译阶段就能确定需要 ...
- java 基础概念 -- 数组与内存控制
问题1: Java在声明数组的过程中,是怎样分配内存的? 在栈内存中 建一个数组变量,再在堆内存中 建一个 数组对象.至于详细的内存分配细节,还得看 该初始化是 数组动态初始化 还是 数组静态初始化. ...
- Java数组以及内存分配
Java数组以及内存分配 什么数组(简) 数组初始化 动态初始化 静态初始化 内存分配问题(重) 数组操作的两个常见小问题 什么是数组: 定义格式: 数组类型 [] 数组名 ; 如:常用格式,其他方式 ...
- 05-02 Java 一维数组、内存分配、数组操作
数组的定义 动态初始化 /* 数组:存储同一种数据类型的多个元素的容器. 定义格式: A:数据类型[] 数组名; B:数据类型 数组名[]; 举例: A:int[] a; 定义一个int类型的数组a变 ...
- [Java基础] Java对象内存结构
转载地址:http://www.importnew.com/1305.html 原文于2008年11月13日 发表, 2008年12月18日更新:这里还有一篇关于Java的Sizeof运算符的实用库的 ...
随机推荐
- FLINK流计算拓扑任务代码分析<二>
首先 是 StreamExecutionEnvironment see = StreamExecutionEnvironment.getExecutionEnvironment(); 我们在编写 fl ...
- STM32 HAL库学习系列第4篇 定时器TIM----- 开始定时器与PWM输出配置
基本流程: 1.配置定时器 2.开启定时器 3.动态改变pwm输出,改变值 HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_1); 函数总结: __HAL_TIM ...
- day1-exercise
""" Day1 作业 Isabelle/刘佳赐 October 22, 2018 """ """ 1. 变量 ...
- python学习之网络编程基础
引入场景:客户与银行关系 银行职员负责给客户提供取钱服务,客户通过账户密码跟银行职员建立合作关系.此时银行职员就可以作为服务器,当用户A取完钱后他需要等待下一个用户的接入,用户的账号密码就是建立合作关 ...
- CTF-安恒19年一月月赛部分writeup
CTF-安恒19年一月月赛部分writeup MISC1-赢战2019 是一道图片隐写题 linux下可以正常打开图片,首先到binwalk分析一下. 里面有东西,foremost分离一下 有一张二维 ...
- openssl windows 下 编译 bat
++++全部++++++++ @echo offrem set sslpath=C:\0openssl\rem echo %sslpath% set X86_lib=C:\0openssl\32\li ...
- pyhton习题20190201
#20190131'''检查ipV4的有效性,有效则返回True,否则返回False,(提示使用split函数进行分割)'''import osdef print_ping_ip(ip): s = o ...
- 20155223 2006-2007-2 《Java程序设计》第4周学习总结
20155223 2006-2007-2 <Java程序设计>第4周学习总结 教材学习内容总结 第六章 Java的继承方法与继承类相当于程序间的数值调用,当然还有程序间函数的调动使用. 继 ...
- 20155318 2016-2017-2 《Java程序设计》第三周学习总结
20155318 2016-2017-2 <Java程序设计>第三周学习总结 教材学习内容总结 一.类与对象 Clothes c1 = new Clothes();将c1名称参考至新建对象 ...
- sqlserver2008 数据库
删除数据库提示: 无法对 数据库'DBName' 执行 删除,因为它正用于复制 之前建立过此数据库的发布订阅,但是后来删掉了发布订阅,也将对应的作业停止了,仍然报这个错,遂用此命令强制删除发布: sp ...