1、autoreleasepool总是会被问到,放在自动释放池中的对象合适被释放?理解不正确的答案:{}出了大括号、出了作用域等等。个人认为参考答案是,1、在不是手动添加的AutoreleasePool时,当前的runloop结束时释放,因为编译器在每个runloop中开始时加入了自动释放池的Push和结束时加入了Pop;2、如果是手动添加的AutoreleasePool,就是在@autorelease{}大括号的时候释放,因为编译器在大括号之后调用的Pop。

 下面有一个例子:
以上是测试代码。
在ios8以下的运行结果是:

这个运行结果也说明了“出了作用域对象就被释放的说法是不正确的”,同时也能发现,对象在viewWillAppear中还没有被释放,而到了viewDidAppear中的时候对象已经被释放了。

再补一张证明确实是在这两个方法之间被释放的图:

我在viewDidLoad讲要结束的时候设置了一个断点,并且在console中设置了对reference变量值变化的监听。当开始继续执行代码,并且改变reference的值时,上图展示了改变的时间点。从图中可以看到,在viewWillAppear之后reference的值被改为了nil,也就是在viewWillAppear之后自动释放池地方了对象。

注:刚在上面写了在ios8之前的结果,因为从ios9开始编译器对NSString的stringWithFormat方法做了改变(优化),下面附一张ios9的结果图:

2、上一条中提到的Autorelease调用Push和Pop

     

上图中展示的是AutoreleasePoolPage的结构图,AutoreleasePool是由若干个AutoreleasePoolPage以双向链表组合而成的。每个AutoreleasePoolPage占有空间的大小是虚拟内存一页的大小(4096bytes字节)
magic:用来校验AutoreleasePoolPage结构的完整性
next:最新添加的autoreleased对象的下一个位置
thread:当前的线程
parent:指向父结点
child:指向子结点
depth:代表深度,从0开始向后递增1
hiwat:high water mark
当next == begin(),表明AutoreleasePoolPage为空;当next == end(),表明AutoreleasePoolPage已满,如下图:

当AutoreleasePoolPage满了之后,就会建立下一个AutoreleasePoolPage对象,新的AutoreleasePoolPage的next指针被初始化在栈底(begin()的位置)。
 
嵌套的AutoreleasePool
     前面只介绍了添加对象的情况,下面说一下释放的时刻:
     每当进行一次objc_autoreleasePoolPush时,runtime向当前的AutoreleasePoolPage中add一个哨兵对象,值为0(nil),效果如下图:

objc_autoreleasePoolPush的返回值是这个哨兵对象的地址,于是在释放的过程中;
     1、根据传入的哨兵对象地址找到哨兵对象所在的AutoreleasePoolPage
     2、在当前AutoreleasePoolPage中,将晚于哨兵对象加入的所有对象发送release消息(可以跨越page),然后移动next指针到正确的位置
     所以知道了AutoreleasePool释放对象的过程之后,嵌套的AutoreleasePool就好理解多了,多层的AutoreleasePool就是对个哨兵对象,每次pop的时候释放上次push的位置(哨兵对象的位置)。
     
 
3、Autorelease的其他
      在ARC中使用@autorelease{}时,编译器将  @autorelease{}转化成:
     void *context = objc_autoreleasePoolPush();
     //{}中的代码
       objc_autoreleasePoolPop(context);//如果不是手动添加的autoreleasePool,就是在当前runLoop结束时调用
     objc_autoreleasePoolPush()是对AutoreleasePoolPage::push()的封装
     objc_autoreleasePoolPop() 是对AutoreleasePoolPage::pop()的封装
 
参考:http://www.cocoachina.com/ios/20141031/10107.html

autoreleasepool的笔记的更多相关文章

  1. IOS学习笔记 O2

    第二章 Objective-C语言基础进阶 一.Objective-C语言写法简化 利用@property快速生成setget方法 1.首先来复习一下setget写法,这是上一节笔记写的setget方 ...

  2. IOS学习笔记 O1

    第一章 Objective-C语言基础 一.OC语言与C语言的比较 C语言是一门面向过程的语言,而OC则是一门面向对象的语言. C语言文件默认保存格式为.c,OC语言默认保存格式为.m,两者头文件格式 ...

  3. Object C学习笔记22-#define 用法

    上一篇讲到了typedef 关键字的使用,可以参考文章 Object C 学习笔记--typedef用法 .而在c中还有另外一个很重要的关键字#define. 一. #define 简介 在C中利用预 ...

  4. Object C学习笔记21-typedef用法

    在上一章的学习过程中遇到了一个关键字typedef,这个关键字是C语言中的关键字,因为Object C是C的扩展同样也是支持typedef的. 一. 基本作用 typedef是C中的关键字,它的主要作 ...

  5. iOS学习笔记之Category

    iOS学习笔记之Category 写在前面 Category是类别(也称为类目或范畴),使用Category,程序员可以为任何已有的类添加方法.使用类别可以对框架提供的类(无法获取源码,不能直接修改) ...

  6. iOS学习笔记之ARC内存管理

    iOS学习笔记之ARC内存管理 写在前面 ARC(Automatic Reference Counting),自动引用计数,是iOS中采用的一种内存管理方式. 指针变量与对象所有权 指针变量暗含了对其 ...

  7. Objective-C 学习笔记(Day 1)

    -------------------------------------------- Hello World //引入头文件 //c中的引入头文件的方式 //#include <stdio. ...

  8. Object C学习笔记10-静态方法和静态属性

    在.NET中我们静态使用的关键字static有着举足轻重的作用,static 方法可以不用实例化类实例就可以直接调用,static 属性也是如此.在Object C中也存在static关键字,今天的学 ...

  9. object - c 语言基础 进阶笔记 随笔笔记

    重点知识Engadget(瘾科技)StackOverFlow(栈溢出)Code4Apprespon魏先宇的程序人生第一周快捷键: Alt+上方向键 跳到最上面  Alt+下方向键 跳到最下面      ...

随机推荐

  1. [转]ESCAPE()、ENCODEURI()、ENCODEURICOMPONENT()区别详解

    escape().encodeURI().encodeURIComponent()区别详解 JavaScript中有三个可以对字符串编码的函数,分别是: escape,encodeURI,encode ...

  2. 有7g和2g的砝码各一个,怎样称可以3次把140g东西分为50g和90g???????

    第一次:等分 50和90为   70 70 2.   7g 和2g  ,取出一个70中的9g   ,  61   70 3.利用 9g和2g砝码,取出61中的11克,前面的9 和 11 都放进70

  3. Implement the hash table using array / binary search tree

    今天在复习Arrays and String 时看到一个很有趣的问题.希望跟大家分享一下. Implement the hash table using array / binary search t ...

  4. SSL 通信及 java keystore 工具介绍

    http://www.javacodegeeks.com/2014/07/java-keystore-tutorial.html Table Of Contents 1. Introduction 2 ...

  5. 编译 Spring-framework的经验分享

    Spring-framework source codegit url: git clone git://github.com/SpringSource/spring-framework.git 导入 ...

  6. 理解runtime system

    最近需要编译不同平台的库,因此比以前只开发C++程序关注底层更多点.先来看看术语runtime system的解释. 主要参考资料: http://en.wikipedia.org/wiki/Runt ...

  7. WebService基于SoapHeader实现安全认证(一)

    本文转载:http://www.cnblogs.com/houleixx/archive/2009/08/22/webservice-soapheader-security.html WebServi ...

  8. iOS 利用Socket UDP协议广播机制的实现

    1.前言 什么是UDP协议广播机制? 举一个例. 比如在一群人群中,一个人要找张三,于是你向人群里大喊一声(广播):"谁是张三" 假设它是张三,它就会回应你.在网络中也是一样的. ...

  9. [TypeScript ] What Happens to Compiled Interfaces

    This lesson covers using your first TypeScript Interface and what happens to the Interface when it i ...

  10. [TypeScript] Loading Compiled TypeScript Files in Browser with SystemJS

    TypeScript outputs JavaScript, but what are you supposed to do with it? This lesson shows how to tak ...