文档章节

Autoreleasepool自动释放池与内存相关

 一苇渡江丶
发布于 2016/01/04 19:26
字数 682
阅读 10
收藏 0


iOS开发中的内存管理:

iOS管理有MRC和ARC

MRC: 在mac中 对象谁申请, 谁释放

ARC: 编译器在编译代码的时候,会根据代码的结构在适当的地方添加retain release autorelease语句.

autorelease自动释放池

标记为autorelease的对象,都会添加到最近一次创建的autoreleasepool自动释放池中

自动释放池销毁的时候 会对释放池中的所有对象发一次release消息.

使用类方法创建对象时,是使用autorelease管理对象, 延时释放

自动释放池什么时候创建

每一次消息循环开始的时候会先创建自动释放池

自动释放池什么时候销毁的

一次消息循环结束之前会释放自动释放池

什么是消息循环


消息循环有什么作用

保证应用程序不退出

循环监测事件,并执行相应的方法

自动释放池在什么时候使用

在循环中创建大量的临时变量时 要在循环一开始的时候就创建自动释放池

在开始一个子线程的时候要,要在子线程开始执行的时候创建一个自动释放池,否则会造成内存泄露,因为子线程无法访问主线程的自动释放池

事例:

          long largeNumber = 100000000;

for(int i = 0; i < largeNumber; ++i) {

    NSString*str = @"Hello World";

    str = [str stringByAppendingFormat:@" - %d", i];

    str = [str uppercaseString];

}

分析:有什么问题, 会造成什么影响

循环进行大量字符串拼接和大小写转换, 会生成大量无临时变量, cpu没时间进行释放, 造成内存消耗的飞涨

解决方法: 在一次循环开始的时候创建自动释放池, 让每一次的循环结束都倾倒一次自动释放池

内存方面的4个问题

内存泄露: 创建一个对象系统会给该对象分配一块内存,当该对象不再使用时,系统会回收该内存,当对象不再被使用,但是内存却没有回收, 会造成这块内存无法再分配给其他程序使用, 这就是"内存泄露”, 如子控件属性被strong修饰 就会造成内存泄露


野指针: 指向僵尸对象(指向内存不可用)的指针, 给野指针发送消息会报错


僵尸对象: 所占用内存已经被回收的对象, 僵尸对象不能再使用了


空指针: 没有指向任何对象的指针, 给空指针发送消息不会报错


内存溢出:


© 著作权归作者所有

粉丝 0
博文 1
码字总数 682
作品 0
朝阳
私信 提问
OC内存管理常见的面试题

#####面试:说一说对内存管理的理解?(原理) - 手动内存管理(MRC):1.在创建一个对象的时候系统会自动创建这个对象的引用计数并赋值为1;2.当引用计数为0的时候,对象会去调用dealloc方法来...

鹿微微鹿
2016/03/25
275
0
OC 内存管理

引用计数的相关内容 ✓OC中内存管理机制就是引用计数 ✓每个对象都有引用计数,理论上如果对象的引用计数为0, 它就会自动释放对象,系统会回收它开辟的内存空间 ✓在实际的开发中,存在多个指针...

GLAlanTong
2016/02/29
26
0
ios内存管理(四):Autorelease技术

  前面章节提到内存释放时,经常会说到当超出变量作用域时,变量会被“自动”释放,其实这只是为了更加简单的说明这个过程。实际上,在ARC模式下是系统帮你自动插入了相应的release逻辑。这...

智小融
2017/12/24
0
0
Autorelease机制讲解

Autorelease机制是在iOS内存管理中的一员。在MRC中,是通过调用[obj autorelease]来延迟内存释放;在ARC中,我们已经完全不需要知道Autorelease就能很好地管理好内存。而在这背后,Objective...

国孩
2018/08/18
0
0
Cocos2d-x开发中Ref内存管理

Ref类是Cocos2d-x根类,Cocos2d-x中的很多类都派生自它,例如,我们熟悉的节点类Node也派生自Ref。我们介绍Ref内存管理。 内存引用计数 Ref类设计来源于Cocos2d-iphone的CCObject类,在Cocos...

智捷课堂
2014/11/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring AOP之同一个对象方法内部自调用导致事务失效问题

对于像我这种喜欢滥用AOP的程序员,遇到坑也是习惯了,不仅仅是事务,其实只要脱离了Spring容器管理的所有对象,对于SpringAOP的注解都会失效,因为他们不是Spring容器的代理类,SpringAOP,就切入不...

xiaomin0322
33分钟前
1
0
Linux learn(七)

例行工作安排(定时任务)at,cron at 由atd服务提供,at指令所产生的的要运作的工作都以文本文件的方式写入 /var/spool/at/目录内,该工作便能等待at的这个服务取用与执行了。 权限限制相关...

lazy~
40分钟前
2
0
Vim与clang-format

前一段时间因工作需要参与了一个开源项目,在向github提交代码后提示格式校验失败。 项目的管理者告知,要想修改的代码能入库需要使用Clang-Format校验。 需要使用下面的命令对上次的修改重新...

DB_Terrill
42分钟前
1
0
Kafka写入数据保证不丢失

Kafka写入数据保证不丢失: 每个partition至少有一个follower在ISR列表中,跟上了Leader的数据同步 每次写入数据时,都要求至少写入partition leader成功,还至少一个ISR里的follower写入成功...

春哥大魔王的博客
48分钟前
1
0
git仓库删除所有提交历史记录,成为一个干净的新仓库

把旧项目提交到git上,但是会有一些历史记录,这些历史记录中可能会有项目密码等敏感信息。如何删除这些历史记录,形成一个全新的仓库,并且保持代码不变呢? 1.切换到新的分支 git check...

dragon_tech
51分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部