随着开发的年限越来越久,越觉得应该知其然更要知其所以然。
不光要用代码,还有知道为什么用,到底为什么用。
下面我们就说一下Autoreleasepool 自动释放池的用户
现在我们大多数情况下开发都是用ARC
ARC下:
@autoreleasepool {
Class *s = [[Class alloc] init];
}
这相当于MRC下:
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init;
Class *s = [[Class alloc] init];
[pool drain];
其实作用就是将对象加入自动释放池。
很多小伙伴这时候就有疑问了,我不加也可以啊。
小编在这里要说的是:存在即合理。
Autoreleasepool用法:
很多时候我们需要做一些循环操作。看下面最简单的这简单的代码
int number = 15;
for (int i = 0; i < number; i++) {
NSString *str = [NSString stringWithFormat:@"hello -%02d", i];
str = [str stringByAppendingString:@" - world"];
}
[NSString stringWithFormat:@"hello -%02d", i]
方法创建的对象会加入到自动释放池里,对象的释放权交给了RunLoop 的释放池- RunLoop 的释放池会等待Runloop即将进入睡眠或者即将退出的时候释放一次
- for循环中线程一直在做事情,Runloop不会进入睡眠
综上:
上边的代码for循环生成的NSString对象会无法及时释放,造成瞬时内存占用过大
解决办法,每次循环时都手动创建一个局部释放池,及时创建,及时释放,这样NSString对象就会及时得到释放
for (int i = 0; i < largeNumber; i++) {
@autoreleasepool {
NSString *str = [NSString stringWithFormat:@"hello -%02d", i];
str = [str stringByAppendingString:@" - world"];
}
}
更多使用方法:
在for循环大量使用imageNamed:
之类的方法生成UIImage对象可能是个更要命的事情,内存随时可能因为占用过多被系统杀掉。