ARC叫自动引用计数Automatic Reference Counting。针对堆上的对象,管理对象的创建和释放。

哪些对象受ARC管理:

  OC对象指针

  Block指针

  使用_attribute_(NSObject定义的typedef

哪些对象不受ARC管理:

值类型(简单值类型,如C语言struct)

使用其他方式分配的堆对象(如malloc分配)

非内存资源

引用计数管理

新创建(使用alloc、new、copy等)一个引用计数类型对象,引用计数为1.

对象引用计数增1----retain操作:(其实就是把当前对象的地址赋值出去,成为一个指针的时候。

将对象引用赋值给其他变量或常量。

将对象引用赋值给其他属性或者实例变量。

将对象传递给函数参数,或者返回值。

将对象加入集合中。

对象引用计数减1----ralease操作 (其实就是指向这个对象的指针销毁的时候)

将指向这个对象的局部变量或全局变量赋值为nil或其他值。

将指向这个对象的属性赋值为nil或其他值。

实例属性所在的对象被释放。(就是某个对象的属性指向这个堆,当这个对象销毁的时候,自然指针也销毁了)

参数或局部变量离开函数。(函数结束了,自然指针也销毁了)

将对象从集合中删除。

引用计数变为0时,内存自动被释放

自动释放池(Autorelease Pool)

release 会导致对象立即释放。如果频繁对对象进行release,可能会造成琐碎的内存管理负担。autorelease可以将release 的调用延迟到自动释放池被释放时。

推荐使用自动释放池(Autorelease Pool)Block,当其结束时,所有接受autorelease消息

AppKir和UIKit框架在处理每一次事件循环迭代时,都会将其放入一个Autorelease Pool中。大多数情况,无需程序员干预。

什么时候需要手工管理Autorelease Pool?

编写的程序不基于UI的框架,比如命令行程序。

在循环中创建大量临时对象,需要更早的释放,避免临时对象聚集导致内存峰值过大。

在主线程之外创建新的线程,在新线程开始执行处,需要创建自己的Autorelease Pool。

可以嵌套使用Autorelease Pool.

ARC默认是开启的,可以手动关闭。

objective-C学习笔记(九)ARC的更多相关文章

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

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

  2. 多线程学习笔记九之ThreadLocal

    目录 多线程学习笔记九之ThreadLocal 简介 类结构 源码分析 ThreadLocalMap set(T value) get() remove() 为什么ThreadLocalMap的键是W ...

  3. MDX导航结构层次:《Microsoft SQL Server 2008 MDX Step by Step》学习笔记九

    <Microsoft SQL Server 2008 MDX Step by Step>学习笔记九:导航结构层次   SQL Server 2008中SQL应用系列及BI笔记系列--目录索 ...

  4. python3.4学习笔记(九) Python GUI桌面应用开发工具选择

    python3.4学习笔记(九) Python GUI桌面应用开发工具选择 Python GUI开发工具选择 - WEB开发者http://www.admin10000.com/document/96 ...

  5. Go语言学习笔记九: 指针

    Go语言学习笔记九: 指针 指针的概念是当时学C语言时了解的.Go语言的指针感觉与C语言的没啥不同. 指针定义与使用 指针变量是保存内存地址的变量.其他变量保存的是数值,而指针变量保存的是内存地址.这 ...

  6. go微服务框架kratos学习笔记九(kratos 全链路追踪 zipkin)

    目录 go微服务框架kratos学习笔记九(kratos 全链路追踪 zipkin) zipkin使用demo 数据持久化 go微服务框架kratos学习笔记九(kratos 全链路追踪 zipkin ...

  7. Python学习笔记九

    Python学习笔记之九 为什么要有操作系统 管理硬件,提供接口. 管理调度进程,并且将多个进程对硬件的竞争变得有序. 操作系统发展史 第一代计算机:真空管和穿孔卡片 没有操作系统,所有的程序设计直接 ...

  8. vue学习笔记(九)vue-cli中的组件通信

    前言 在上一篇博客vue学习笔记(八)组件校验&通信中,我们学会了vue中组件的校验和父组件向子组件传递信息以及子组件通知父组件(父子组件通信),上一篇博客也提到那是对组件内容的刚刚开始,而本 ...

  9. C#线程学习笔记九:async & await入门二

    一.异步方法返回类型 只能返回3种类型(void.Task和Task<T>). 1.1.void返回类型:调用方法执行异步方法,但又不需要做进一步的交互. class Program { ...

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

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

随机推荐

  1. 製程能力介紹(SPC introduction) ─ Ck之製程能力解釋

    Ck之製程能力解釋 a=M-X: 代表規格中心(也就是製程之期望中心)與實際製造出來之群體中心的距離. b=T/2: 代表規格的一半. 所以,當Ck=a/b=M-X/(T/2)以文字來說明就是:實際作 ...

  2. Mongodb 安装迁移

    <pre name="code" class="python">1.下载MongoDB(64位) http://fastdl.mongodb.org ...

  3. C# MVC 自学笔记—6 编辑方法和编辑视图

    ==============================翻译============================== 运行该应用程序并浏览到Movies控制器通过将/Movies追加到您的浏览 ...

  4. Android的UI两大基石

        说到Android的UI就不得不从一切的开始View开始说.     让我们从Android Developer上的View的Overview和UI Overview来开始吧.     Cla ...

  5. Qt编写端口扫描工具

    Qt提供了QTcpSocket类,可以方便地建立TCP连接.利用这一功能,Maxiee编写了一个简单地端口扫描工具. 软件的功能就是,扫描某一网段的固定端口,如80端口,若目的地址开放了这一端口,那么 ...

  6. android上传位置信息导致的流量大爆炸问题调查

    原由:项目中有人写了个位置上传的服务,其实一直没问题,后来不知道什么时候出现了很多抱怨,是开着app流量一下子跑掉了几个G,差点就要卖房子还移动话费了,很多同事哭笑不得的找上门来,后来PM解决了,我一 ...

  7. SSIS: 把存储在数据库中的图片导出来

    Data Flow Task Step 1 获取二进制图片数据 )='C:\labs\Images\' SELECT ThumbNailPhoto,@path+ThumbnailPhotoFileNa ...

  8. 像jq那样获取对象的js原生方法

    使用过jq的童鞋非常喜欢jq获取对象的方法,只要$()就可以获取,在此我封装一个js获取对象的方法 [注意]只对chrome,Firefox,opera,Safari,ie8及ie8以上版本有效 fu ...

  9. 百度apistore第三方登陆

    最近做一个个人博客,其中的登陆模块我想使用第三方登陆来做.上网搜一下有好多例子,但是大多数都是一个网站的第三方登陆,如QQ.微博.人人,没有集成的组件,于是就在网上搜一下百度的apistore,百度果 ...

  10. 关于scala和java 在maven项目中混编的问题

    1.需要添加scala 相关maven配置: <properties> <scala.version>2.10.1</scala.version> <slf4 ...