autoreleasepool自动释放池

问答

  • 自动释放池的作用是什么?

    • 延迟释放
  • 那些对象会延迟释放?

    • 所有用类方法实例化的对象都是延迟释放的
  • 对象何时被销毁?

    • 所有延迟释放的对象在超出作用域之后会被添加到最新创建的自动释放池中,但是不会被立即销毁,当自动释放池被销毁时,会向池中所有对象发送release消息,释放所有延迟释放的对象
  • 自动释放池何时被销毁?

示意图

iPhone Application Launches > iPhone Touch Event > Cocoa Touch Creates Event > Event Object
⬆️ ⬇️ ⬇️
⬆️ > Autorelease Pool < Cocoa Touch Creates Autorelease Pool
Application Object(s) ⬅️ ⬇️
Application Handles Event <
Cocoa Touch Darins Autorelease Pool <
  • 自动释放池在ARC中工作吗?

    • 工作,编译器在编译时会根据代码添加retainreleaseautorelease

面试题

题目

  • 以下代码是否有问题,如果有该如何修正?

题目

int largeNo = 2 * 1024 * 1024;
for (int i = 0;i < largeNo;i++){
	NSString *str = [NSString stringWithFormat:@"Hello"];
	str = [str uppercaseString];
	str = [str stringByAppendingString:@" World"];
}

答案

  • 每一次都会实例化新的str,超出作用域之后会被添加到自动释放池中,如果循环次数很多,会在一次循环之后把自动释放池耗尽

解决

int largeNo = 2 * 1024 * 1024;
@autoreleasepool { // 放在外面,保证循环之后释放循环中的自动释放对象
	for (int i = 0;i < largeNo;i++){
		//@autoreleasepool {
		// 放在内部,每一次循环之后,都倾倒一次自动释放池,内存管理时最好的,但性能不好
			NSString *str = [NSString stringWithFormat:@"Hello"];
			str = [str uppercaseString];
			str = [str stringByAppendingString:@" World"];
		//}
	}
}