关于autorelease pool一个较好的理解
2019独角兽企业重金招聘Python工程师标准>>>
如果你能够真正的理解autorelease,那么你才是理解了Objective c的内存管理。Autorelease实际上只是把对release的调用延迟了,对于每一个Autorelease,系统只是把该Object放入了当前的Autorelease pool中,当该pool被释放时,该pool中的所有Object会被调用Release。
[1]理解autoreleasepool
在Iphone项目中,大家会看到一个默认的Autorelease pool,程序开始时创建,程序退出时销毁,按照对Autorelease的理解,岂不是所有autorelease pool里的对象在程序退出时才release, 这样跟内存泄露有什么区别?
答案是,对于每一个Runloop, 系统会隐式创建一个Autorelease pool,这样所有的release pool会构成一个象CallStack一样的一个栈式结构,在每一个Runloop结束时,当前栈顶的Autorelease pool会被销毁,这样这个pool里的每个Object会被release。
那什么是一个Runloop呢? 一个UI事件,Timer call, delegate call, 都会是一个新的Runloop。Autorelease是保证一个method安全的,对于method中的函数调用也适用。例子如下:
NSString* globalObject;- (void)applicationDidFinishLaunching:(UIApplication *)application
{globalObject = [[NSString alloc] initWithFormat:@"Test"];NSLog(@"Retain count after create: %d", [globalObject retainCount]); // output 1.[globalObject retain];NSLog(@"Retain count after retain: %d", [globalObject retainCount]); // output 2.
}- (void)applicationWillTerminate:(UIApplication *)application
{NSLog(@"Retain count after Button click runloop finished: %d", [globalObject retainCount]);// 输出1. Button click loop finished, it's autorelease pool released, globalObject get released once.
}-(IBAction)onButtonClicked
{[globalObject autorelease];NSLog(@"Retain count after autorelease: %d", [globalObject retainCount]);// 输出2。 Autorelease被call, globalObject被加如当前的AutoreleaePool。
}
[2]为什么需要Auto release ?
2.1) 很多C/C++转过来的程序员会说,这个auto release有什么好,象C/C++那样,自己申请,自己释放,完全可控不好么, 这个auto relase 完全不可控,你都不知到它什么时候会被真正的release。我的理解它有一个作用就是可以做到每个函数对自己申请的对象负责,自己申请,自己释放,该函数的调用者不需要关心它内部申请对象的管理。 在下面这个例子中,Func1的调用者不需要再去关心obj的释放。
ClassA *Func1()
{ClassA *obj = [[[ClassA alloc]init]autorelease];return obj;
}
实际上对于 [NSString stringWithFormat:] 这类构造函数返回的对象都是autorelease的。
2.2) autorelease pool来避免频繁申请/释放内存(就是pool的作用了)。这个应该是相对比较好理解的。
总结:
1)一定要注意Autorelease pool的生存周期,理解Runloop,避免在对象被释放后使用。
2)[NSString stringWithFormat:]这类函数返回的对象是不需要再自己release的,它已经被autorelease了, 如果你想把它当一个全局对象使用,那必须自己再retain, 释放时再release。
转载于:https://my.oschina.net/u/255456/blog/467924
关于autorelease pool一个较好的理解相关推荐
- Objective-C Autorelease Pool 的实现原理[转]
http://blog.leichunfeng.com/blog/2015/05/31/objective-c-autorelease-pool-implementation-principle/ 内 ...
- Autorelease Pool
前言 之前有写过一篇关于AutoreleasePool的理解的总结,总觉的不够深入,所以重起一篇.本篇从阅读官方文档和autorelasepool的源码入手来记录. Autorelease Pool ...
- NSRunLoop中Autorelease pool 管理
http://segmentfault.com/q/1010000000123664 iOS的运行时是由一个一个runloop组成的,每个runloop都会执行下图的一些步骤: 可以看到,每个runl ...
- RunLoop总结:RunLoop 与GCD 、Autorelease Pool之间的关系
如果在面试中问到RunLoop相关的知识,很有可能也会问到RunLoop与GCD.Autorelease Pool有没有关系,哪些地方用到了GCD.Autorelease Pool等. So,本文就总 ...
- Python:通过一个小案例深入理解IO多路复用
通过一个小案例深入理解IO多路复用 假如我们现在有这样一个普通的需求,写一个简单的爬虫来爬取校花网的主页 import requests import timestart = time.time()u ...
- java继承类型转换_#java 一个简单的例子理解java继承、成员函数重写、类型转换...
一个简单的例子理解java继承.成员函数重写.类型转换 1.继承简介 举一个简单的例子:笔分为很多种,比如毛笔.钢笔.圆珠笔等等,这些笔都有一些相同的属性比如长度.笔迹的粗细等等:但他们也有不同的特点 ...
- AI 的下一个重大挑战:理解语言的细微差别
简评:人类语言非常博大精妙,同一句话在不同的语境下,就有不同的含义.连人类有时候都不能辨别其中细微的差别,机器能吗?这就是人工智能的下一个巨大挑战:理解语言的细微差别.本文原作者是 Salesforc ...
- gitk产生的错误 autorelease pool page 0x7f8d45239000 corrupted
今天使用gitk查看提交变动时,发现报错了.不知道是从另一台电脑上迁移的有问题还是其他导致的,头疼啊. 当前系统环境mac os Catalina(10.15.7) 报错信息如下: objc[1552 ...
- 从一个class文件深入理解Java字节码结构
前言 我们都知道,Java程序最终是转换成class文件执行在虚拟机上的,那么class文件是个怎样的结构,虚拟机又是如何处理去执行class文件里面的内容呢,这篇文章带你深入理解Java字节码中的结 ...
最新文章
- 安卓通讯录系统mysql_Android手机通讯录项目开发--联系人数据库contacts2.db介绍
- XamarinAndroid组件教程设置动画的设置插值器
- Windows系统下首次安装深度学习框架Caffe失败
- bulid-tool
- hadoop设置ssh免密码登录
- 域名相关的一些基础知识
- 投票彰显电信合约机诺基亚Lumia 800C受热捧
- 关系型数据库的核心单元是_核中的数据关系
- 01.神经网络和深度学习 W2.神经网络基础(作业:逻辑回归 图片识别)
- 算法竞赛入门经典 第五章总结1
- 去除jQuery mobile默认样式
- 论文赏析[AI18]更快的基于非二叉化自底向上策略的转移系统成分句法分析
- c语言逻辑运算符的运算符优先级,逻辑运算符及其优先级,C语言逻辑运算符及其优先级详解(示例代码)...
- 图形化开发(五)042-Three.js之Camera相机——正交相机和透视相机的对比
- 在移动硬盘上安装Deepin Linux 操作系统
- JAVA计算机毕业设计智慧茶园综合管理系统Mybatis+源码+数据库+lw文档+系统+调试部署
- 用智能硬件“折叠时间”,外卖商家正在触摸的数字化未来
- 区块链赋能医疗产业报告
- [内附完整源码和文档] 基于Java的商场促销活动信息管理系统
- linux shell 键盘输入 $,linuxshell在while中用read从键盘输入的实现