iOS ARC也会有内存泄露
iOS提供了ARC功能,很大程度上简化了内存管理的代码。
但使用ARC并不代表了不会发生内存泄露,使用不当照样会发生内存泄露。
下面列举两种内存泄露的情况。
1,循环参照
A有个属性参照B,B有个属性参照A,如果都是strong参照的话,两个对象都无法释放。
这种问题常发生于把delegate声明为strong属性了。
例,
- @interface SampleViewController
- @property (nonatomic, strong) SampleClass *sampleClass;
- @end
- @interface SampleClass
- @property (nonatomic, strong) SampleViewController *delegate;
- @end
上例中,解决办法是把SampleClass 的delegate属性的strong改为assing即可。
ARC通过记录指向某对象的指针数量来判断该对象是否应该被释放(0代表可以释放)。因而如果出现循环引用,就会出现内存泄露。如下图所示。
取消3->2的引用
导致泄露。
弱引用不增加计数,
从而消除leak。
2,死循环
如果某个ViewController中有无限循环,也会导致即使ViewController对应的view关掉了,ViewController也不能被释放。
这种问题常发生于animation处理。
例,
比如,
- CATransition *transition = [CATransition animation];
- transition.duration = 0.5;
- tansition.repeatCount = HUGE_VALL;
- [self.view.layer addAnimation:transition forKey:"myAnimation"];
上例中,animation重复次数设成HUGE_VALL,一个很大的数值,基本上等于无限循环了。
解决办法是,在ViewController关掉的时候,停止这个animation。
- -(void)viewWillDisappear:(BOOL)animated {
- [self.view.layer removeAllAnimations];
- }
内存泄露的情况当然不止以上两种。
即使用了ARC,我们也要深刻理解iOS的内存管理机制,这样才能有效避免内存泄露。
iOS ARC也会有内存泄露的更多相关文章
- ARC模式下的内存泄露问题
ARC模式下的内存泄露问题 iOS提供的ARC 功能很大程度上简化了编程,让内存管理变得越来越简单,但是ARC并不是说不会发生内存泄露,使用不当照样会发生. 以下列举两种内存泄露情况: 死循环造成的内 ...
- ios CGImageRelease 出现 EXC_BAD_ACCESS的错误 ios特定形状剪裁图片 内存泄露
CGImageRef imgRef = [image CGImage]; 通过此种方式的得到的CGImageRef不能利用CGImageRelease释放,因为你不拥有它所以不用释放 在ios中特定形 ...
- 深度:ARC会导致的内存泄露
iOS提供了ARC功能,很大程度上简化了内存管理的代码. 但使用ARC并不代表了不会发生内存泄露,使用不当照样会发生内存泄露. 下面列举两种内存泄露的情况. 1,循环参照 A有个属性参照B,B有个属性 ...
- 使用ARC也可能发生内存泄露
1,循环参照 A有个属性参照B,B有个属性参照A,如果都是strong参照的话,两个对象都无法释放. 这种问题常发生于把delegate声明为strong属性了. 例, @interface Samp ...
- iOS: ARC & MRC下string内存管理策略探究
ARC & MRC下string内存管理策略探究 前两天跟同事争论一个关于NSString执行copy操作以后是否会发生变化,两个人整了半天,最后写代码验证了一下,发现原来NSString操作 ...
- iOS ARC编译器规则和内存管理规则
iOS 开发当中,自动引用计数已经是标准的内存管理方案.除了一些老旧的项目或者库已经没有人使用手动来管理内存了吧. ARC无疑是把开发者从繁琐的保留/释放引用对象逻辑中解脱出来.但这并不是万事大吉了, ...
- ARC下的内存泄露
iOS提供了ARC功能,很大程度上简化了内存管理的代码. 但使用ARC并不代表了不会发生内存泄露,使用不当照样会发生内存泄露. 下面列举两种ARC导致内存泄露的情况. 1,循环参照 A有个属性参照B, ...
- android内存泄露小谈
在做android的时候,用的语言大部分情况下都是java.以前最开始做的是编译器开发, 大部分情况都是用c语言和x86与arm架构的汇编,后来接触到ios用的是OC.对比之下, 感觉还是java用起 ...
- iOS 之 ARC 的内存泄露
循环引用导致内存泄露,如block容易内存泄露
随机推荐
- Linux目录处理命令
1 创建命令 mkdir -p 目录名 其中 -p表示递归创建,英文为make directories td@td-Lenovo-IdeaPad-Y410P:~$ mkdir Test 上述命令在 ...
- 【Zookeeper】分布式服务框架 Zookeeper -- 管理分布式环境中的数据
Zookeeper 分布式服务框架是 Apache Hadoop 的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务.状态同步服务.集群管理.分布式应用配置项的管理 ...
- Java高级特性—JVM
1).java监控工具使用 jconsole是一种集成了上面所有命令功能的可视化工具,可以分析jvm的内存使用情况和线程等信息 visualvm 提供了和jconsole的功能类似,提供了一大堆的插件 ...
- 15 Basic ‘ls’ Command Examples in Linux
FROM: http://www.tecmint.com/15-basic-ls-command-examples-in-linux/ ls command is one of the most fr ...
- Shell命令-----VI
vi的基本操作 a) 进入vi 在系统提示符号输入vi及文件名称后,就进入vi全屏幕编辑画面: $ vi file 不过有一点要特别注意,就是您进入vi之后,是处于「命令行模式(comman ...
- Node.js静态页面展示例子2
例程下载:https://files.cnblogs.com/files/xiandedanteng/nodejsStaticHtmlSample.rar 页面效果: Html页面代码(注意用文本编辑 ...
- 原始Ajax
var $ = { request:function(obj){ //1. 获得xmlhttprequest对象兼容性处理 var xhr; //unde ...
- HBase数据同步到ElasticSearch的方案
ElasticSearch的River机制 ElasticSearch自身提供了一个River机制,用于同步数据. 这里能够找到官方眼下推荐的River: http://www.elasticsear ...
- expect获取返回值
对于获取多台server状态且不用交互须要用到expect,但有时候expect无法获取返回值.这里解释一下expect怎样获取返回值 expect -c " spawn $1; ...
- Jenkins与Docker相关的Plugin使用
原文地址:http://blog.csdn.net/ztsinghua/article/details/52128140 Jenkins与Docker相关的Plugin 在Jenkins Plugin ...