autoreleasepool 自动释放池的理解
Posted huangzs
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了autoreleasepool 自动释放池的理解相关的知识,希望对你有一定的参考价值。
常见的面试题:以下代码存在什么样的问题?应该如何改进?
for (int i = 0; i < 100000; i++) { NSString *str = @"abc"; str = [str stringByAppendingString:@"xyz"]; } |
利用leaks查看内存泄漏情况
可知:NSString对象str并没有马上被释放,在内存中会同时存在100000个NSString对象,造成内存急增,等100000for循环结束才释放
改进:
for (int i = 0; i < 100000; i++) { @autoreleasepool { NSString *str = @"abc"; str = [str stringByAppendingString:@"xyz"]; } } |
或者(注意NSAutoreleasePool ARC下不可用,必须将工程改为MRC)
for (int i = 0; i < 100000; i++) { //创建一个自动释放池 NSAutoreleasePool *pool = [NSAutoreleasePool new]; NSString *str = @"abc"; str = [str stringByAppendingString:@"xyz"]; //自动释放池被销毁或耗尽,会向自动释放池中的所有对象发送release消息 [pool drain]; } |
利用leaks查看内存泄漏情况
可知:不会造成内存急增,每次for循环结束NSString对象str都会释放,在内存中会只存在1个NSString对象str
自动释放池(autoreleasepool)的工作原理:
//@autoreleasepool {}中的代码 void *context = objc_autoreleasePoolPush(); //当前runloop迭代结束时进行pop操作 objc_autoreleasePoolPop(context); |
autoreleasepool是个栈结构,对象加入池子时其实质是进行入栈Push操作,释放对象时其实质是进行出栈Pop操作。
标记为autorelease的对象在出了作用域范围后,会被添加到最近一次创建的自动释放池中,当前runloop迭代结束时,会向自动释放池中的所有对象发送release消息,当池子里的所有对象引用计数都为0
时该池子被销毁
以上是关于autoreleasepool 自动释放池的理解的主要内容,如果未能解决你的问题,请参考以下文章
Swift 中的 @autoreleasepool 等价物是啥?
如何为 nsoperationqueue 正确使用 autoreleasepool
iOS之深入解析自动释放池autoreleasepool的底层原理