- @autoreleasepool是什么?
- @autoreleasepool个人理解是和MRC下的NSAutoreleasePool一样的
- NSAutoreleasePool又是什么?
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSString* str = [[[NSString alloc] initWithString:@"666"] autorelease];
[pool release];
我们可以在创建对象的时候给对象发送"autorelease"消息,然后当NSAutoreleasePool结束的时候,标记过"autorelease"的对象就会被释放掉。
在ARC下,我们不需要在写autorelease消息,ARC会自动帮我们加。这个时候@autoreleasepool做的事情,就和NSAutoreleasePool一模一样了。
什么时候用@autoreleasepool?
-
官方是这样说的
- 写基于命令行的的程序时,就是没有UI框架,如AppKit等Cocoa框架时。
- 写循环,循环里面包含了大量临时创建的对象。(本文的例子)
- 创建了新的线程。(非Cocoa程序创建线程时才需要)
- 长时间在后台运行的任务。
利用@autoreleasepool优化循环
-
利用@autoreleasepool优化来循环的内存占用
- 如果循环次数非常多,而且循环体里面的对象都是临时创建使用的,就可以用@autoreleasepool 包起来,让每次循环结束时,可以及时释放临时对象的内存
//来自Apple文档,见参考
NSArray *urls = <# An array of file URLs #>;
for (NSURL *url in urls) {
@autoreleasepool {
NSError *error;
NSString *fileContents = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error];
/* Process the string, creating and autoreleasing more objects. */ }
}
- @autoReleasePool什么时间释放?
- 每次Runloop结束时会有专门的时机用来释放