Post

理解ARC-自动引用计数

理解ARC-自动引用计数

1. 什么是 ARC?

Objective-C 语言中,ARCAutomatic Reference Counting,自动引用计数) 是一种 编译时 的内存管理技术,它的主要作用是:

  • 自动管理对象的引用计数(retainCount)。
  • 在合适的时机自动释放对象,防止 内存泄漏悬垂指针
  • 开发者无需手动调用 retainreleaseautorelease

示例:使用 ARC 进行内存管理

1
2
3
4
5
6
7
8
9
10
11
12
@interface Person : NSObject
@property (nonatomic, strong) NSString *name;
@end

@implementation Person
@end

void example() {
    Person *person = [[Person alloc] init];
    person.name = @"John";
    NSLog(@"Person: %@", person.name);
} // 当函数执行完毕,ARC 自动释放 person

ARC 环境下,personexample() 作用域结束后会被自动释放,无需手动调用 release


2. ARC 是如何管理对象生命周期的?

2.1 引用计数(Reference Counting)

每个 Objective-C 对象都有一个 引用计数,即 retainCount。当 retainCount 变为 0 时,ARC 负责销毁该对象。

  • 对象被创建时,retainCount = 1
  • 当有新对象引用它时,retainCount +1
  • 当引用消失时,retainCount -1
  • retainCount 归零,ARC 释放对象

2.2 强引用(Strong Reference)

strongARC 中最常见的引用类型。对象只要被 strong 变量引用,就不会被释放。

1
@property (nonatomic, strong) NSString *name;

如果 strong 指针消失,ARC 会自动释放对象。

2.3 弱引用(Weak Reference)

weak 引用不会增加 retainCount,它适用于防止 循环引用retain cycle)。

1
@property (nonatomic, weak) id delegate;

strong 对象释放时,weak 指针会自动设为 nil,避免访问野指针。

示例:

1
__weak Person *weakPerson = person;

person 释放时,weakPerson 自动变成 nil,防止崩溃。

2.4 autorelease@autoreleasepool

ARC 仍然支持 autorelease,但推荐使用 @autoreleasepool 进行优化。

1
2
3
4
@autoreleasepool {
    NSString *str = [NSString stringWithFormat:@"Hello, ARC!"];
    NSLog(@"%@", str);
} // `str` 在 `autoreleasepool` 结束时释放

在大批量创建对象时,使用 @autoreleasepool 可以减少内存峰值,提高性能。

This post is licensed under CC BY 4.0 by the author.