ARC下引用类型及限定符

1.引用类型

ARC 带 来 了 新 的 引 用 类 型: 弱 引 用。 深 入 理 解 这 些 引 用 类 型 对 内 存 管 理 非 常 重 要。 支 持 的 类 型 包 括 以 下 两 种。

  • 强 引 用
    强 引 用 是 默 认 的 引 用 类 型。 被 强 引 用 指 向 的 内 存 不 会 被 释 放。 强 引 用 会 对 引 用 计 数 加 1, 从 而 扩 展 对 象 的 生 命 周 期。
  • 弱 引 用
    弱 引 用 是 一 种 特 殊 的 引 用 类 型。 它 不 会 增 加 引 用 计 数, 因 而 不 会 扩 展 对 象 的 生 命 周 期。 在 启 用 了 ARC 的 Objective-C 编 程 中, 弱 引 用 格 外 重 要。

2.变 量 限 定 符

ARC 为 变 量 供 了 四 种 生 命 周 期 限 定 符。

  • __strong
    这 是 默 认 的 限 定 符, 无 需 显 示 引 入。 只 要 有 强 引 用 指 向, 对 象 就 会 长 时 间 驻 留 在 内 存 中。 可 以 将 __strong 理 解 为 retain 调 用 的 ARC 版 本。
  • __weak
    这 表 明 引 用 不 会 保 持 被 引 用 对 象 的 存 活。 当 没 有 强 引 用 指 向 对 象 时, 弱 引 用 会 被 置 为 nil。 可 将 __weak 看 作 是 assign 操 作 符 的 ARC 版 本, 只 是 对 象 被 回 收 时,__weak 具 有 安 全 性—— 指 针 将 自 动 被 设 置 为 nil。
  • __unsafe_unretained
    与 __weak 类 似, 只 是 当 没 有 强 引 用 指 向 对 象 时,__unsafe_unretained 不 会 被 置 为 nil。 可 将 其 看 作 assign 操 作 符 的 ARC 版 本。
  • __autoreleasing
    __autoreleasing 用 于 由 引 用 使 用 id * 传 递 的 消 息 参 数。 它 预 期 了 autorelease 方 法 会 在 传 递 参 数 的 方 法 中 被 调 用。

下面的代 码 展 示 了 限 定 符 的 使 用:

Person * __strong p1 = [[ Person alloc] init]; 
Person * __weak p2 = [[ Person alloc] init]; 
Person * __unsafe_unretained p3 = [[ Person alloc] init]; 
Person * __autoreleasing p4 = [[ Person alloc] init];

3.属 性 限 定 符

属 性 声 明 有 两 个 新 的 持 有 关 系 限 定 符: strong 和 weak。 此 外, assign 限 定 符 的 语 义 也 被 更 新 了。 一 言 以 蔽 之, 现 在 共 有 六 个 限 定 符。

  • strong
    默 认 符, 指 定 了 __strong 关 系。
  • weak
    指 定 了 __weak 关 系。
  • assign
    这 不 是 新 的 限 定 符, 但 其 含 义 发 生 了 改 变。 在 ARC 之 前, assign 是 默 认 的 持 有 关 系 限 定 符。 在 启 用 ARC 之 后, assign 表 示 了 __unsafe_unretained 关 系。
  • copy
    暗 指 了 __strong 关 系。 此 外, 它 还 暗 示 了 setter 中 的 复 制 语 义( https://developer.apple.com/library/mac/documentation/Cocoa/reference/Foundation/Classes/nsobject_Class/Reference/Reference.html#//apple_ref/occ/instm/NSObject/copy) 的 常 规 行 为。
  • retain
    指 定 了 __strong 关 系。 retain 是 ARC 纪 元 之 前 的 老 古 董, 现 代 的 代 码 已 经 鲜 有 使 用。
  • unsafe_unretained
    指 定 了 __unsafe_unretained 关 系。

下面的代 码 展 示 了 变 量 限 定 符 的 使 用:

@property (nonatomic, strong) IBOutlet UILabel *titleView; 
@property (nonatomic, weak) id < UIApplicationDelegate > appDelegate; 
@property (nonatomic, assign) BOOL selected; 
@property (nonatomic, copy) NSString *name; @property (nonatomic, retain) HPPhoto *photo; 
@property (nonatomic, unsafe_unretained) UIView *danglingReference;

你可能感兴趣的:(copy,assign,retain,strong,weak)