理解ARC-自动引用计数
理解ARC-自动引用计数
1. 什么是 ARC?
在 Objective-C 语言中,ARC(Automatic Reference Counting,自动引用计数) 是一种 编译时 的内存管理技术,它的主要作用是:
- 自动管理对象的引用计数(
retainCount)。 - 在合适的时机自动释放对象,防止 内存泄漏 和 悬垂指针。
- 开发者无需手动调用
retain、release、autorelease。
示例:使用 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 环境下,person 在 example() 作用域结束后会被自动释放,无需手动调用 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)
strong 是 ARC 中最常见的引用类型。对象只要被 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.