iOS @autoreleasepool是什么?什么時候用?什么時候釋放

  • @autoreleasepool是什么?
    • @autoreleasepool個人理解是和MRC下的NSAutoreleasePool一樣的
    • NSAutoreleasePool又是什么?
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSString* str = [[[NSString alloc] initWithString:@"666"] autorelease];
[pool release];
  • 我們可以在創(chuàng)建對象的時候給對象發(fā)送"autorelease"消息,然后當(dāng)NSAutoreleasePool結(jié)束的時候,標(biāo)記過"autorelease"的對象就會被釋放掉。

  • 在ARC下,我們不需要在寫autorelease消息,ARC會自動幫我們加。這個時候@autoreleasepool做的事情,就和NSAutoreleasePool一模一樣了。

  • 什么時候用@autoreleasepool?

  • 官方是這樣說的

    • 寫基于命令行的的程序時,就是沒有UI框架,如AppKit等Cocoa框架時。
    • 寫循環(huán),循環(huán)里面包含了大量臨時創(chuàng)建的對象。(本文的例子)
    • 創(chuàng)建了新的線程。(非Cocoa程序創(chuàng)建線程時才需要)
    • 長時間在后臺運行的任務(wù)。
  • 利用@autoreleasepool優(yōu)化循環(huán)

  • 利用@autoreleasepool優(yōu)化來循環(huán)的內(nèi)存占用

    • 如果循環(huán)次數(shù)非常多,而且循環(huán)體里面的對象都是臨時創(chuàng)建使用的,就可以用@autoreleasepool 包起來,讓每次循環(huán)結(jié)束時,可以及時釋放臨時對象的內(nèi)存
//來自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結(jié)束時會有專門的時機用來釋放
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容