理解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.