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

相關文章
相關標籤/搜索