参考博客:

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. convertdate

    sample date 2015-09-10 00:00:00 2015-09-09 00:00:00.000 expect iso date, add time zone 2015-09-10T00 ...

  2. asp.net生成随机密码

    public string RandCode(int n) { char[] arrChar = new char[]{ 'a','b','d','c','e','f','g','h','i','j' ...

  3. 关于CSS三列Float布局任务

    任务目标 掌握HTML/CSS布局的概念 掌握盒模型的概念 掌握position与float的概念以及在布局时的用法 任务描述 使用 HTML 与 CSS 按照示意图;实现三栏式布局. 左右两栏宽度固 ...

  4. python 笔记2:python语法基础

    python语法学习笔记: 1 输入输出 input(),print(). name = input('input your name : ')print('hello ,'+name)print(& ...

  5. 批处理——putCMAC小版本

    @ECHO off del telcc.vbs del telcc.bat del ftp1.txt del ftp1.bat @echo off setlocal enabledelayedexpa ...

  6. IOS BLE蓝牙4.0

    前言: 自己做的项目里面有这么一个功能,总结归纳一下. 先导入必要的框架  CoreBluetooth.framework 在要用到蓝牙的文件里面导入以下头文件 #import <CoreBlu ...

  7. X删除数据表的新用法

    删除数据表,可以这样进行,以前傻不拉唧的用sql去手动删除.             DAL dal = ...             dal.Db.CreateMetaData().SetSche ...

  8. LCD相关知识点

    1.LCD即液晶显示器,控制原理是控制其中的电子枪,在n行*n列的屏幕上投射不同颜色从而形成图像 2.编程步骤: ①打开LCD背光将LCD背光对应的GPIO设置为禁止上拉(GPxUP相应位写入1),选 ...

  9. 闲扯游戏编程之html5篇--山寨版《flappy bird》源码

    新年新气象,最近事情不多,继续闲暇学习记点随笔,欢迎拍砖.之前的〈简单游戏学编程语言python篇〉写的比较幼稚和粗糙,且告一段落.开启新的一篇关于javascript+html5的从零开始的学习.仍 ...

  10. Math类常用方法(Java)

    三角函数: public static double sin (double radians) public static double cos(double radians) public stat ...