zoukankan      html  css  js  c++  java
  • 自动引用计数(ARC)

     1.1什么是自动引用技术

      顾名思义,自动引用计数(ARC, Automatic Reference Counting)是指内存管理中对引用采取自动计数的技术。以下摘自苹果官方说明:

      在Objective-C中采用Automatic Reference Counting(ARC)机制,让编译器来进行内存管理。在新一代Apple LLVM编辑器中设置ARC为有效状态,就无需再次键入retain或者release代码,这在降低程序崩溃、内存泄露等风险的同时,很大程度上减少了开发程序的工作量。编译器完全清楚目标对象,并能立刻释放那些不再被使用的对象。如此一来,应用程序将具有可预测性,且能流畅运行,速度也将大幅度提升。

      这些优点无疑极具吸引力,但关于ARC技术,最重要的还是下面这一点:

      “在LLVM编译器中设置ARC为有效状态,就无需再次键入retain或者release代码。”

      换言之,若满足以下条件,就无需手工输入retain和release代码了。

    • 使用Xcode 4.2或以上版本。
    • 使用LLVM编译器3.0或以上版本。
    • 编译器选项中设置ARC为有效。

      在以上条件下编译源代码时,编译器将自动进行内存管理,这正是每个程序员梦寐以求的。在正式讲解ARC技术之前,我们先来了解下程序员在代码中是如何手动进行内存管理的。

    1.2 内存管理/引用计数

    1.2.1概要

      Objective-C中的内存管理,也就是引用计数。可以用开关房间的灯为例来说明引用计数的机制。

      假设办公室的照明设备只要一个,上班进入办公室的人需要照明,所以需要把灯打开。而对于下班离开办公室的人来说,已经不需要照明了,所以要把灯关掉。若是很多人上下班,每个人都开灯或者关灯,那么办公室的情况又将如何呢?最早下班离开的人如果关了灯,办公室里还没走的所有人都将处于一片黑暗之中。

      解决这一问题的办法,是使办公室在还有至少一人的情况下保持开灯状态,而在无人时保持关灯状态。

      (1) 最早进入办公室的人开灯。

      (2) 之后进入办公室的人,需要照明。

      (3) 下班离开办公室的人,不需要照明。

      (4) 最后离开办公室的人关灯(此时已无人需要照明)

      为判断是否还有人在办公室里,这里导入计数功能来计算"需要照明的人数"。流程如下:

      (1) 第一个人进入办公室,“需要照明的人数” +1.计数值从0变成了1,因此要开灯。

      (2) 之后每当有人进入办公室,“需要照明的人数” 就+1。计数值从1变成2。

      (3) 每当有人下班,离开办公室,“需要照明的人数”就-1。计数值从2变成1.

      (4) 最后一个人下班,离开办公室时,“需要照明的人数” -1.计数值从1变成0,因此要关灯。

      这样就能在不需要照明的时候保持关灯状态。办公室仅有的照明设备得到了很好的管理。

     

      在Objective-C中,“对象”相当于办公室的照明设备。在现实世界中,办公室的照明设备只有一个,但在Objective-C中的世界里,虽然计算机资源有限,但一台计算机可以同时处理好几个对象。

    此外,“对象的使用环境”相当于上班进入办公室的人,虽然这里的“环境”有时也指在运行中的程序代码、变量、变量作用域、对象等,但在概念上就是使用对象的环境。上班进入办公室的人对办公室照明设备发出的动作,与Objective-C中的对应关系则如下表所示:

    对照明设备所做的动作 对Objective-C对象所做的动作
    开灯   生成对象
    需要照明 持有对象
    不需要照明 释放对象
    关灯 废弃对象

     使用计数功能计算需要照明的人数,使办公室的照明得到了很好的管理。同样,使用引用计数功能,对象也就能得到很好的管理,这就是Objective-C的内存管理。如下图:

    如果你错过了一天,那么你就真的错过了一天……ues.hk
  • 相关阅读:
    B-线性代数-距离公式汇总
    B-线性代数-范数
    B-线性代数-矩阵转置
    B-概率论-贝叶斯决策
    B-概率论-极大似然估计
    B-概率论-条件概率
    2018.1.7java转型
    追求
    面向心态
    数据类型和type函数
  • 原文地址:https://www.cnblogs.com/myios/p/3631610.html
Copyright © 2011-2022 走看看