3.1 TLS优化
在MRC时代,autoreleased对象的创建与持有是以以下形式进行的:
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
ViewController *obj = [ViewController viewController];
[obj retain];
[obj release];
}
+ (instancetype)viewController {
ViewController *obj = [[ViewController alloc] init];
return [obj autorelease];
}
alloc
autorelease
retain
release
按以上4个步骤依次进行,然而函数依次调用中autorelease、retain的作用效果又是相互抵消的。既然如此,我们为什么还要将对象进行入池、出池操作并进行一系列的内存管理呢?在代码中这样的无做功操作是十分常见的,所以在ARC时代编译器会根据函数的调用列表来判断autorelease之后是否紧接着调用了retain,如果是则将原本需要push进Autoreleasepool的对象直接返回给函数的调用方,免去繁琐的内存管理操作,从而对CPU调用进行优化。
|