前二天去某土豪創(chuàng)業(yè)公司面試被問到了內(nèi)存管理的一些問題做修,面試官提到了autoreleasepool的問題媒怯,但是由于項(xiàng)目中從來沒有用過赠制,當(dāng)時(shí)的回答全是憑自己的想象赶袄,結(jié)果也就可想而知了。
回來后查閱了很多資料猴娩,發(fā)現(xiàn)autoreleasepool和runloop有密切的關(guān)系阴幌。
下面舉一下面試官的問題:
{
NSString *str = @"a";
}
給一段上述代碼勺阐,問str對象什么時(shí)候釋放,我回答的是函數(shù)體執(zhí)行完后就釋放了裂七,面試官反問是么,我說是吧(感覺到自己是錯(cuò)的仓坞,但是一直用ARC背零,這快真的從來沒有在意過TOT)。
然后面試官又問无埃,下面這么寫呢徙瓶。我說也是函數(shù)體執(zhí)行完后釋放吧(已經(jīng)慌了,要GG)嫉称。面試官笑著說:那你這么說寫不寫豈不是都一樣侦镇?
{
@autoreleasepool {
NSString *str = @"a"
}
今天找時(shí)間再次看了一下autoreleasepool的原理,發(fā)現(xiàn)提到了runloop织阅,雖然之前看過runloop壳繁,但是看得并不是很仔細(xì)。于是又重新看了一遍荔棉,發(fā)現(xiàn)了一些之前錯(cuò)誤的認(rèn)識(shí)闹炉,同時(shí)也知道了autoreleasepool內(nèi)對象的時(shí)機(jī),其實(shí)和runloop的執(zhí)行時(shí)機(jī)有關(guān)润樱,和函數(shù)體沒有半毛錢關(guān)系渣触。
接下來就有疑問了,為什么要在函數(shù)體內(nèi)又寫一次@autoreleasepool壹若。查閱資料后嗅钻,發(fā)現(xiàn)了這樣有利于局部變量立刻釋放,于是自己做了一個(gè)小測試:
for (int i=0;i<100000;i++) {
UIImage *image = [UIImage imageNamed:@"pic"];
}
運(yùn)行結(jié)果如下店展,可以看到內(nèi)存直接瘋長养篓,最高達(dá)到了200M。
![Paste_Image.png](http://upload-images.jianshu.io/upload_images/1796297-
再看看加了@autoreleasepool后:
for (int i=0;i<100000;i++) {
@autoreleasepool {
UIImage *image = [UIImage imageNamed:@"pic"];
}
}
運(yùn)行結(jié)果如下:
可以看到內(nèi)存并沒有出現(xiàn)瘋長的情況赂蕴,因?yàn)锧autoreleasepool的作用觉至,每次循環(huán)結(jié)束后,局部變量會(huì)立刻釋放睡腿。