参考博客:

http://blog.leichunfeng.com/blog/2015/05/31/objective-c-autorelease-pool-implementation-principle/

这一块和内存管理相关,只有理解了 autorelease 的原理,我们才算是真正了解了 Objective-C 的内存管理机制。

这里最重要的一点,是要理解一个autoreleased对象被alloc出来,其引用计数就是1。尽管没有其他对其强持有,也不会立即释放(之前说一个__weak一出来就会被释放的想方法,是错误的),而是在当前的autoreleased pool 干涸后,才会被释放。换句话说,出了所在AutoPool,其引用计数减1,引用计数为0,对象被释放。

通过这段测试代码就非常好理解:

输出为:

解释:

1,string是被加到当前最近的autorelease pool的,这个pool会在viewwillappear和viewdidappear中间被调用。所以,在viewwillappear,[nsstring ]对象的引用计数为1,没被释放,stirng_weak_不为nil。

2,把当前变量手动添加到一个自创的autorelease pool中。那出了这个autorelease pool,局部变量string被回收,[nsstring ]对象引用计数减1。同时autorelease 对象[nsstring ]引用计数减1,为0,被释放。所以string_weak_打印是nil。

3,这种情况,出了autorelease pool,对象的引用计数减少1。但是string依旧持有该对象,所以并没有被释放。当viewwillappear函数结束,string指针被回收,[nsstring ]对象引用计数为0,被释放。

关于NSThread,NSRunloop,NSAutoreleasePool

每一个线程,包括主线程,都会拥有一个专属的 NSRunLoop 对象,并且会在有需要的时候自动创建。(每个线程都会维护自己的 autoreleasepool)。

在系统级的线程,比如通过 dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) 获取到的线程,都会在每个event loop开始前,系统自动创建一个 autoreleasepool ,并在 event loop 结束时 drain 。比如场景1,autoreleasepool在viewwillAppear和viewdidappear中drain。

【引】objective-c,6:Autorelease Pool的更多相关文章

  1. 黑马程序员-autorelease pool

    Autorelease:可以延迟给对象发送release消息.发送一个autorelease消息给对象,证明该对象在一定时间内有效,一定时间后会对该对象进行释放,进行一次release. 一个auto ...

  2. Autorelease pool

    根据苹果官方文档中对 Using Autorelease Pool Blocks 的描述,我们知道在下面三种情况下是需要我们手动添加 autoreleasepool 的: 如果你编写的程序不是基于 U ...

  3. Objective-C Autorelease Pool 的实现原理

    内存管理一直是学习 Objective-C 的重点和难点之一,尽管现在已经是 ARC 时代了,但是了解 Objective-C 的内存管理机制仍然是十分必要的.其中,弄清楚 autorelease 的 ...

  4. RunLoop总结:RunLoop 与GCD 、Autorelease Pool之间的关系

    如果在面试中问到RunLoop相关的知识,很有可能也会问到RunLoop与GCD.Autorelease Pool有没有关系,哪些地方用到了GCD.Autorelease Pool等. So,本文就总 ...

  5. objective-C 的内存管理之-自动释放池(autorelease pool)

    如果一个对象的生命周期显而易见,很容易就知道什么时候该new一个对象,什么时候不再需要使用,这种情况下,直接用手动的retain和release来判定其生死足矣.但是有些时候,想知道某个对象在什么时候 ...

  6. Using Autorelease Pool Blocks

    https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmAut ...

  7. 什么时候应该使用Autorelease Pool

    csdn首发:http://blog.csdn.net/guijiewan/article/details/46470285 Objective c使用ARC之后,一般都不需要再手动调用retain, ...

  8. Objective C中的ARC的修饰符的使用---- 学习笔记九

    #import <Foundation/Foundation.h> @interface Test : NSObject /** * 默认的就是__strong,这里只是做示范,实际使用时 ...

  9. 理解autorelease

    如果你能够真正的理解autorelease,那么你才是理解了Objective c的内存管理.Autorelease实际上只是把对release的调用延迟了,对于每一个Autorelease,系统只是 ...

随机推荐

  1. jdbc基本查询方法

    jdbc操作数据库时,最基本的三种接口是Statement PreparedStatment  CallableStatement (1)Statement createStatement() cre ...

  2. Angular JS的模块依赖

    AngularJS是纯客户端技术,完全用Javascript编写的.它使用的是网页开发的常规技术(HTML,CSS,Javascript),目的是让网页应用开发更快更容易. AngularJS简化应用 ...

  3. 【转】Linux Top 命令解析 比较详细

    TOP命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况.   TOP是一个动态显示过程,即可以通过用户按键来不断刷新当前状态.如果在前台执行该命令,它将独占前台,直到用户 ...

  4. 开启GZIP(转)

    因为在做一个项目,项目里面服务器主要提供数据,但是数据多了文件就大了,比较浪费流量和时间,我们便用Gzip来处理.我在本机上是apache,服务器上是IIS6.0,用的是php,那么我就在这里分享一下 ...

  5. 更改mysql中当前auto_increment的值的方法

    最近给自己网站更改mysql中当前auto_increment的值 如果在mysql中一个表test中的ID字段设为auto_increment插入两条记录后ID=2,这时删除1条记录,再插入一条变成 ...

  6. web前端从0开始--1

    博主以前没接触过web前端,最近刚开始学习. 在学习的同时,希望能不断整理总结.于是便有了此博客. 博主技术浅薄,并且第一次写此类博客,希望各位大牛能多多保函. 好了废话不多说了,开始正文. web前 ...

  7. TypeScript Handbook 2——接口1(翻译)

    接口(Interfaces) One of TypeScript's core principles is that type-checking focuses on the 'shape' that ...

  8. js操作table

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  9. MSSQL数据库安装失败

    1停止所有跟Sql相关的服务:控制面板-〉管理工具-〉服务2.在控制面板中卸载所有和SQL有关的一切程序或者组建3.注册表清理():3.1彻底删除SQL Server: hkey_local_mach ...

  10. C++ Daily 《6》---- 类静态对象与函数静态对象

    C++ 的一个哲学基础是,你不应该为你使用的东西付出代价. class 拥有一个 static 成员,即使从未被用到,它也会被构造和析构: 而 函数拥有一个 static 成员, 如果这个函数从未被调 ...