iOS @autoreleasepool是什么?什么时候用?什么时候释放

  • @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结束时会有专门的时机用来释放

你可能感兴趣的:(iOS @autoreleasepool是什么?什么时候用?什么时候释放)