Autorelease自动释放池的使用

Autorelease自动释放池的使用

  • 使用ARC开发,只是在编译时,编译器会根据代码结构自动添加了retain、release和autorelease.
  • MRC内存管理原则:谁申请,谁释放 遇到alloc/copy/retain 都须要添加release或autorelease
  • autorelease 只是一个标记,代表会延迟释放 当一个autorelease对象超出本身的做用域后,会被添加到离他最近的autorelease pool中,当pool开始倾倒的时候,会向池里面全部的对象发送一次release方法,释放pool中全部的对象。

自动释放池autorelease pool的释放与消息循环有关ui

  • 模拟一个简单的消息循环
void click(int type){ printf("你执行的操做%d \n",type); } int main(int argc, const char * argv[]) { @autoreleasepool { while (YES) { printf("请输入要执行的操做,0结束:"); int n; scanf("%d",&n); //接收用户的输入 等待 阻塞程序的运行 if (n == 0) { printf("程序结束\n"); break; }else{ click(n); continue; } } } return 0; } 
  • 消息循环的执行过程

应用程序开启->事件发生(例如点击)->转换成一个事件对象->开启autorelease pool->执行咱们的处理代码,代码中生成的临时变量均可以放在pool中->pool销毁->下一次循环spa

  • 主线程的消息循环

主线程内默认有一个开启的消息循环,在事件开启的时候建立自动释放池,在事件结束的时候倾倒释放池线程

自动释放池的使用场景

  • 在循环中建立大量的临时变量
  • 在子线程中
  • 下面为循环中自动释放池使用 :
for (int i = 0; i < largeNumber; ++i) { @autoreleasepool{ NSString *str = @"Hello World"; str = [str stringByAppendingFormat:@" - %d", i]; str = [str uppercaseString]; NSLog(@"%@", str); } } 

在循环中建立了大量的临时对象NSString,在方法没有走完的状况下,每次建立的对象是不会释放的,因此咱们用自动释放池,在每次循环开始的时候把临时变量NSString放到池里,等每次循环结束的时候倾倒池子,从而每次释放释放NSString临时变量。code

相关文章
相关标签/搜索