objective-C学习笔记(九)ARC
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的更多相关文章
- iOS学习笔记之ARC内存管理
iOS学习笔记之ARC内存管理 写在前面 ARC(Automatic Reference Counting),自动引用计数,是iOS中采用的一种内存管理方式. 指针变量与对象所有权 指针变量暗含了对其 ...
- 多线程学习笔记九之ThreadLocal
目录 多线程学习笔记九之ThreadLocal 简介 类结构 源码分析 ThreadLocalMap set(T value) get() remove() 为什么ThreadLocalMap的键是W ...
- MDX导航结构层次:《Microsoft SQL Server 2008 MDX Step by Step》学习笔记九
<Microsoft SQL Server 2008 MDX Step by Step>学习笔记九:导航结构层次 SQL Server 2008中SQL应用系列及BI笔记系列--目录索 ...
- python3.4学习笔记(九) Python GUI桌面应用开发工具选择
python3.4学习笔记(九) Python GUI桌面应用开发工具选择 Python GUI开发工具选择 - WEB开发者http://www.admin10000.com/document/96 ...
- Go语言学习笔记九: 指针
Go语言学习笔记九: 指针 指针的概念是当时学C语言时了解的.Go语言的指针感觉与C语言的没啥不同. 指针定义与使用 指针变量是保存内存地址的变量.其他变量保存的是数值,而指针变量保存的是内存地址.这 ...
- go微服务框架kratos学习笔记九(kratos 全链路追踪 zipkin)
目录 go微服务框架kratos学习笔记九(kratos 全链路追踪 zipkin) zipkin使用demo 数据持久化 go微服务框架kratos学习笔记九(kratos 全链路追踪 zipkin ...
- Python学习笔记九
Python学习笔记之九 为什么要有操作系统 管理硬件,提供接口. 管理调度进程,并且将多个进程对硬件的竞争变得有序. 操作系统发展史 第一代计算机:真空管和穿孔卡片 没有操作系统,所有的程序设计直接 ...
- vue学习笔记(九)vue-cli中的组件通信
前言 在上一篇博客vue学习笔记(八)组件校验&通信中,我们学会了vue中组件的校验和父组件向子组件传递信息以及子组件通知父组件(父子组件通信),上一篇博客也提到那是对组件内容的刚刚开始,而本 ...
- C#线程学习笔记九:async & await入门二
一.异步方法返回类型 只能返回3种类型(void.Task和Task<T>). 1.1.void返回类型:调用方法执行异步方法,但又不需要做进一步的交互. class Program { ...
- Objective C中的ARC的修饰符的使用---- 学习笔记九
#import <Foundation/Foundation.h> @interface Test : NSObject /** * 默认的就是__strong,这里只是做示范,实际使用时 ...
随机推荐
- eclipse 快捷方式大全
Ctrl+1 快速修复(最经典的快捷键,就不用多说了)Ctrl+D: 删除当前行 Ctrl+Alt+↓ 复制当前行到下一行(复制增加)Ctrl+Alt+↑ 复制当前行到上一行(复制增加)Alt+↓ 当 ...
- 让EF支持sql语句
BaseDal类: public class BaseDal : IDisposable { #region 事件 internal Func<bool> DBCommitting; in ...
- SQL Server索引进阶:第十二级,创建,修改,删除
在第十级中我们看到了索引的内部结构,在第十一级中我们看到了平衡树结构潜在的负面影响:索引碎片.有了索引内部结构的知识,我们可以检查在执行数据定义语句和数据操作语句的时候,都发生了什么.在本级中我们介绍 ...
- 电商网站前端架构#1 多页面 vs 单页面
课程地址:http://www.imooc.com/learn/186 讲师:远人 课程基础: html css js ,做过一些项目. 多页面 我们往常使用的web服务大多是多页面形式,依靠后端的架 ...
- JavaScript引用类型之Array数组的排序方法
数组中已经存在两个JavaScript给我们定义好的重排序的方法:reverse()和sort()方法,下面来简单分析下: 1.reverse() 用于反转数组项的顺序,代码如下: <sc ...
- 【ActionBar的使用】
在AS工程中使用ActionBar 简单实用: 1.功能清单文件中指定主题标签属性Theme.Holo或其子类 <application android :theme="@androi ...
- ubuntu菜单面板丢了怎么找回
我的ubuntu菜单面板丢了. 我的ubuntu用的是gnome桌面环境,桌面环境分为三个区域: 1.菜单面板 (1)三个主菜单:应用程序,位置,系统. (2)快速启动区:菜单面板中间的部分称为快 ...
- Dijkstra算法求单源最短路径
Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店 ...
- window.external.JavaScriptCallCpp
方案2: 1.编写html <html> <head> </head> <body> <script language="javascr ...
- BZOJ 3207: 花神的嘲讽计划Ⅰ( hash + 可持久化线段树 )
O(NK)暴力搞出所有子串的哈希值, 然后就对哈希值离散化建权值线段树, 就是主席树的经典做法了.总时间复杂度O(NK+(N+Q)logN) ----------------------------- ...