亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

RunLoop和autorelease的一道面試題

2019-11-14 19:12:22
字體:
來源:轉載
供稿:網友

有這么一道ios面試題 以下代碼有沒有什么問題?如果有?如何解決?

for (int i = 0 ; i < largeNumber; i++) {		NSString *str = [NSString stringWithFormat:@"hello -%04d",i];	str = [str stringByAppendingString:@" - world"]; }

局部釋放池和RunLoop釋放池的概念:

主線程的RunLoop是默認開啟的(視圖用[[NSRunLoop currentRunLoop] runUntilDate:[NSDate date]]來停止它,也是做不到的), 每一次消息循環開始的時候會先創建自動釋放池,這次循環結束前,會釋放自動釋放池,然后RunLoop等待下次事件源。 在這個過程中,由RunLoop創建的釋放池類似于一個全局的釋放池。但是開發者可以任何執行的地方創建釋放池,也就是局部的釋放池,這時的釋放池類似于代碼塊 當釋放池結束的時候會自動釋放。因此一般情況下,局部的自動釋放池很快就被釋放了,而RunLoop釋放池會等一次消息循環結束的時候釋放。

什么樣的對象會交給釋放池管理:

返回當前類的實例的類方法創建出來的對象,都是autorelease的,會交給所在的釋放池進行管理。 例如創建一個Person類,使用[[self alloc]init]方法創建的對象的管理不會交給它所在的釋放池,而是根據引用計數來控制釋放的時機, 如果使用[[[self alloc]init] autorelease]創建的對象,會交給所在的釋放池管理,控制其釋放的時機。

- (void)test{	@autoreleasepool {        Person *p = [[Person alloc]init];        p = nil;        NSLog(@"---");    }    NSLog(@"autorelease結束");}

執行結果:

Person---dealloc---autorelease結束

 

- (void)test1{        @autoreleasepool {        Person *p = [Person person]; // 內部是[[[self alloc]init] autorelease]        p = nil;        NSLog(@"---");    }    NSLog(@"autorelease結束");}

執行的結果為:

---Person---deallocautorelease結束

因此自動釋放池被銷毀或耗盡時會向池中所有使用autorelease創建的對象發送release 消息,釋放所有autorelease的對象,而不是所有的對象。

回到面試的問題:

當我們使用for循環創建很多個使用autorelease方式創建的NSString對象的時候,將所有的對象的釋放權都交給了RunLoop 的釋放池,而RunLoop的釋放池會等待這個事件處理之后才會釋放,因此就會使對象無法及時釋放,堆積在內存造成內存泄露,可以在Debug Navigation 中觀察到內存激增。為了驗證確實是因為autorelease這種創建方式引起的內存泄露,我做了如下的測試:

int largeNumber = 100000000;- (void)test3{    for (int i = 0 ; i < largeNumber; i++) {        NSString *str = [[NSString alloc]initWithFormat:@"hello -%04d",i];        str = [str stringByAppendingString:@" - world"];    }}// 將stringWithFormat:方法換成了alloc+initWithFormat:// 這樣做的結果是內存幾乎沒有變化,驗證了內存飆升確實是autorelease創建方式造成的。

但是在編寫代碼的時候我們仍然習慣用類的快速創建方法,而不是alloc+init。也就是說,為了方便寫程序,又使用了底層實現是alloc+init+autorelease的快速創建對象的方法(如 stringWithFormat:)。因此解決的方案就是添加局部的釋放池,以及時釋放內存,如果將局部釋放池添加到循環外:

- (void)test4{    @autoreleasepool {        for (int i = 0 ; i < largeNumber; i++) {            NSString *str = [NSString stringWithFormat:@"hello -%04d",i];            str = [str stringByAppendingString:@" - world"];        }    }}

這樣顯然是沒有效果的,釋放池需要等循環執行之后再釋放內存,這和使用RunLoop創建的釋放池沒有什么區別。 較好的方案就是每次循環的時候添加一個釋放池:

- (void)test5{    for (int i = 0 ; i < largeNumber; i++) {        @autoreleasepool {            NSString *str = [NSString stringWithFormat:@"hello -%04d",i];            str = [str stringByAppendingString:@" - world"];        }    }}

這樣每一次循環的結束時都會釋放一次內存,因而這個循環全部執行完成時也幾乎補不消耗內存。

總結是:

做多線程開發時,需要在線程調度方法中手動添加自動釋放池,尤其是當執行循環的時候,如果循環內部有使用類的快速創建方法創建的對象, 一定要將循環體放到自動釋放池中。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩一中文字幕| 欧美综合第一页| 亚洲一区二区在线播放| 国产精品久久久久久久久久三级| 国产精品久久久久久久久久久久久久| 欧美壮男野外gaytube| 欧美激情第一页xxx| 精品久久久久久久久国产字幕| 日韩av网站大全| 亚洲影视中文字幕| 亚洲最大福利网| 日韩成人av网址| 欧美日韩高清在线观看| 国产亚洲欧美另类中文| 欧美一区二区.| 欧美精品生活片| 久久精品中文字幕一区| 精品二区三区线观看| 国产亚洲精品激情久久| 日本久久精品视频| 国产主播欧美精品| 亚洲美女自拍视频| 欧美主播福利视频| 亚洲精品国产精品国自产观看浪潮| 亚洲女人天堂色在线7777| 日韩经典一区二区三区| 亚洲加勒比久久88色综合| 国模吧一区二区| 少妇精69xxtheporn| 国产精品久久77777| 97视频在线观看视频免费视频| 伊人久久免费视频| 亚洲97在线观看| 国产精品成人免费视频| 国产精品高潮呻吟久久av无限| 欧美人在线观看| 另类视频在线观看| 97免费中文视频在线观看| 国产精品福利网站| 91精品国产91久久| 成人激情综合网| 成人免费观看49www在线观看| 国产精品毛片a∨一区二区三区|国| 国产成人午夜视频网址| 777国产偷窥盗摄精品视频| 中文字幕在线日韩| 精品久久香蕉国产线看观看gif| 亚洲第一区第一页| 日韩成人激情影院| 久久久999精品免费| 亚洲视频在线观看网站| 日韩中文字幕国产| 国产97色在线|日韩| 欧美大尺度电影在线观看| 日韩经典第一页| 欧美精品激情blacked18| 欧美一级大片在线观看| 亚洲情综合五月天| 久久久久久久国产| 一区二区福利视频| 亚洲国产成人av在线| 51精品国产黑色丝袜高跟鞋| 久久久久久久国产| 精品女同一区二区三区在线播放| 欧美视频在线观看 亚洲欧| 高清欧美性猛交xxxx| 丰满岳妇乱一区二区三区| 欧美精品日韩三级| 国产女人18毛片水18精品| 成人情趣片在线观看免费| 国产成人在线播放| 日韩专区在线观看| 在线免费看av不卡| 国产香蕉精品视频一区二区三区| 日韩精品中文字| 欧美激情在线狂野欧美精品| 亚洲精品日韩丝袜精品| 亚洲欧美日韩一区二区在线| 奇米四色中文综合久久| 精品中文字幕久久久久久| 精品久久久久久久久久国产| 国产免费一区二区三区香蕉精| 久久天天躁狠狠躁夜夜躁2014| 欧美亚洲国产日韩2020| 日韩av手机在线看| 亚洲精品少妇网址| 国产精品国产自产拍高清av水多| 色一区av在线| 国产精品夜间视频香蕉| 欧美成人一区二区三区电影| 8090成年在线看片午夜| 亚洲精品小视频在线观看| 日韩在线观看免费网站| 日韩精品中文字幕在线| 亚洲精品有码在线| 日韩av免费看网站| 久久久精品免费视频| 琪琪第一精品导航| 欧美成人高清视频| 欧美日韩免费看| 欧美性xxxx极品hd欧美风情| 成人精品一区二区三区电影黑人| www日韩欧美| 亚洲人a成www在线影院| 亚洲一区二区三区xxx视频| 国产91精品久久久| 日韩免费观看在线观看| 日韩国产精品亚洲а∨天堂免| 日韩中文有码在线视频| 亚洲人成电影网站色xx| 伊是香蕉大人久久| 欧美疯狂xxxx大交乱88av| 国产精品久久久久久久久久99| 欧美精品在线视频观看| 亚洲欧洲国产伦综合| 国产视频一区在线| 国产欧美婷婷中文| 日韩欧美综合在线视频| 亚洲电影免费观看高清完整版在线观看| 国产精品日韩av| 国产女精品视频网站免费| 91精品国产高清久久久久久91| 超碰精品一区二区三区乱码| 欧美在线视频免费观看| 亚洲最大激情中文字幕| 午夜欧美不卡精品aaaaa| 久久久人成影片一区二区三区| 亚洲午夜女主播在线直播| 亚洲性日韩精品一区二区| 粗暴蹂躏中文一区二区三区| 国产精品视频地址| 欧美专区在线观看| 成人精品久久久| 国内精品久久久久久久| 亚洲精品mp4| 亚洲免费成人av电影| 国产国语刺激对白av不卡| 亚洲综合中文字幕68页| 91久久精品国产| 欧美精品在线免费播放| 国产精品一二三视频| 欧美中文字幕在线视频| 国产乱肥老妇国产一区二| 久久精品国产2020观看福利| 久热精品视频在线观看| 欧美日韩中文在线观看| 91久久精品国产91久久性色| 国产精品69av| 免费91麻豆精品国产自产在线观看| 国产精品久久久久影院日本| 国产日韩欧美自拍| 欧美日本国产在线| www.久久草.com| 亚洲日本aⅴ片在线观看香蕉| 一本一道久久a久久精品逆3p| 韩剧1988在线观看免费完整版| 少妇av一区二区三区| 久久影视三级福利片| 亚洲精品免费在线视频| 亚洲肉体裸体xxxx137| 亚洲天堂男人天堂女人天堂| 色偷偷亚洲男人天堂| 国产亚洲成av人片在线观看桃| 欧美电影在线观看|