跳到主要内容

内存管理 Autorelease、retain、copy、assign的set方法和含义?

参考答案:

在早期的 Objective-C 编程中,特别是在使用手动内存管理(Manual Reference Counting, MRC)时,autoreleaseretaincopyassign 是用于管理对象生命周期和内存使用的关键概念。这些属性修饰符定义了对象的属性(或称为实例变量)在赋值时的行为。当使用 ARC(Automatic Reference Counting,自动引用计数)时,这些概念仍然适用,但很多细节由编译器自动处理。

以下是这些修饰符的简要说明和它们的 set 方法的行为:

  1. assign:

    • 含义: 用于简单的数据类型,如 C 语言的基础数据类型(int, float, double, struct 等)和指针。
    • set 方法行为: 直接赋值,不进行任何内存管理操作。
  2. retain:

    • 含义: 表示对象被保留(即其引用计数加1)。
    • set 方法行为: 在赋值给属性之前,先调用对象的 retain 方法增加其引用计数。如果之前已经有对象被赋值给该属性,则先调用该对象的 release 方法减少其引用计数。
  3. copy:

    • 含义: 创建一个对象的新副本,并保留这个副本。
    • set 方法行为: 创建一个对象的深拷贝(对于可变对象如 NSMutableStringNSMutableArray)或浅拷贝(对于不可变对象如 NSStringNSArray),并保留这个新对象。如果之前已经有对象被赋值给该属性,则先调用该对象的 release 方法减少其引用计数。

    注意:对于遵循 NSCopying 协议的对象,应确保正确实现了 copyWithZone: 方法。

  4. autorelease:

    • 含义: 将对象放入自动释放池,稍后在自动释放池被清空时释放对象。
    • 注意: autorelease 不是一个属性修饰符,而是一个方法。它通常用于那些你不直接拥有但需要稍后释放的对象。在 MRC 环境中,使用 autorelease 可以避免过早释放对象,同时确保对象在不再需要时被释放。

在 ARC 环境下,开发者不再需要显式调用 retainreleaseautorelease,因为编译器会自动处理这些内存管理操作。但是,理解这些概念仍然很重要,因为它们有助于理解 Objective-C 内存管理的底层原理,以及在某些情况下(如与 Core Foundation 框架交互时)仍然需要手动管理内存。

对于属性,ARC 下通常使用 strongweakunowned 来代替 retainassign(对于非对象类型)和 unsafe_unretainedcopy 属性仍然用于需要深拷贝的情况,尤其是当属性是 NSStringNSArrayNSDictionary 等不可变对象时。