1. @autoreleasepool基本工作原理
- 在Objective-C中,当对象发送
alloc
、new
、copy
、mutableCopy
等方法创建对象时,该对象的引用计数会增加。通常情况下,需要在合适的地方调用release
或autorelease
方法来减少引用计数,以避免内存泄漏。
@autoreleasepool
是一种自动释放池机制。当一个对象调用autorelease
方法时,它并不会立即释放内存,而是被添加到最近的自动释放池中。当自动释放池被销毁时,池中的所有对象都会收到release
消息,引用计数减1。如果引用计数变为0,对象的内存就会被释放。
2. 在代码执行流程中的作用
- 自动释放对象:在
@autoreleasepool
块内创建并自动释放的对象,会在块结束时被自动释放。例如:
@autoreleasepool {
NSString *str = [[NSString alloc] initWithFormat:@"Hello"];
[str autorelease];
// 当自动释放池结束时,str会收到release消息
}
- 内存峰值控制:对于循环中大量创建临时对象的场景,如果不使用
@autoreleasepool
,这些对象会持续占用内存,导致内存峰值过高。通过在循环内创建@autoreleasepool
,可以及时释放循环中创建的自动释放对象,降低内存峰值。如:
for (int i = 0; i < 10000; i++) {
@autoreleasepool {
NSString *tempStr = [[NSString alloc] initWithFormat:@"Number %d", i];
[tempStr autorelease];
}
}
- 作用域控制:
@autoreleasepool
定义了一个自动释放对象的作用域,块内自动释放的对象仅在该块内有效,块结束后对象会被释放,从而保证内存的及时回收。