- @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é)束時會有專門的時機用來釋放