麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

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

iOS-再談ARC里內存問題,ARC里數組、對象內存得不到釋放?

2019-11-14 18:52:21
字體:
來源:轉載
供稿:網友

1.前言  

     本來以為在改成ARC以后,不再需要考慮內存問題了,可是在實踐中還是發現有一些內存問題需要注意,今天我不談block的循環引用的問題,主要說說一些對象、數組不內存得不到釋放的情況.
 

2.數組內存得不到釋放的情況  

//組織字典數據- (NSMutableDictionary *)setupDicData{       NSMutableDictionary *dict = [NSMutableDictionary dictionary];    for (int i = 0; i <= 30; i++) {               [dict setObject:[self setupArrayData] forKey:[NSString stringWithFormat:@"%d%@",i,@"class"]];    }    return dict;}//組織數組數據- (NSMutableArray *)setupArrayData{       NSMutableArray *marry = [NSMutableArray array];       for (int i = 0; i<=30; i++) {               NSString *s = [NSString stringWithFormat:@"%@",@"data-test"];               [marry addObject:s];           }    return marry;}

 運行+——

 

- (void)viewDidLoad {       [super viewDidLoad];          while (true) {               //30.0定時執行               [NSThread sleepForTimeInterval:30.0];               NSDictionary *dict = [self setupDicData];               NSLog(@"%@",dict);        //每次數據內存都得不到釋放    }}

 

 
//按上代碼傳遞數組執行,每次數組、對象內存都得不到釋放。如圖:
內存會無線的往上增加,直至崩潰。
 
 

2.是什么原因導致這種內存得不到釋放的?  

 
主要是你在iOS里使用    while (true) {} 無線循環時,
iOS ARC默認認為你這個方法永遠沒有執行完,所以不會去主動釋放你方法里的對象,這一點和java不一樣,
所以很多JAVA開發者轉iOS后習慣性的使用while(true){}
導致項目里存在這種內存隱患,導致內存無限增加。

 

3.如何解決這種數組傳遞內存得不到釋放的情況?  

解決方法一:

3.1.最簡單最直接在ARC的環境下使用        @autoreleasepool {}  

 //@autoreleasepool {}的作用是在每次循環一次,都會把內存主動釋放掉  - (void)viewDidLoad {        [super viewDidLoad];            while (true) {               @autoreleasepool {            //30.0定時執行                        [NSThread sleepForTimeInterval:30.0];                        NSDictionary *dict = [self setupDicData];                        NSLog(@"%@",dict);            //每次數據內存都得不到釋放        }    }} 

 

 內存圖,我們發現很穩定,每次都會主動將內存釋放
 
 
解決方法二:

3.2.使用NSTimer來做數組傳遞的無限循環,ARC會自動幫你釋放內存  

- (void)usingDatadosomething{       //30.0定時執行       [NSThread sleepForTimeInterval:0.10];       NSDictionary *dict = [self setupDicData];       NSLog(@"%@",dict);    //每次數據內存都得不到釋放}- (void)viewDidLoad {       [super viewDidLoad];       [NSTimer scheduledTimerWithTimeInterval:30.0 target:self selector:@selector(usingDatadosomething) userInfo:self repeats:YES];       [[NSRunLoop currentRunLoop] run];   }

 內存圖如下

 

解決方法三:

3.3.使用block封裝數組傳遞,最后做block的釋放,ARC會自動幫你釋放內存  

block使用較為頻繁,不在本文章闡述,下次會專門寫一篇block的博客。
謝謝大家,還有什么疑問可以評論中提出,我有時間會耐心回復!
 
 
作者: 清澈Saup
出處: http://www.companysz.com/qingche/
本文版權歸作者和博客園共有,歡迎轉載,但必須保留此段聲明,且在文章頁面明顯位置給出原文連接。

 

 

 

 

 

 

 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 美女视频大全网站免费 | 欧美黄色片一级 | 免费观看一级黄色片 | 日本高清在线免费 | 久在线草 | 国产一级在线看 | av不卡免费在线 | 性看小视频 | av观看国产| 欧美成人小视频 | 亚洲电影在线观看高清免费 | 成人免费一区二区三区在线观看 | 亚洲成人在线视频网 | 久久久综合视频 | 操碰网| 精品国产九九九 | 免费黄色在线观看网站 | asian附近女人裸体pics | 九色p| 欧美不卡| 久久久久一区二区三区 | 成人性视频欧美一区二区三区 | 日本中文字幕高清 | 久久免费激情视频 | 天天夜夜草 | 国产高清成人久久 | 日本教室三级在线看 | 欧美一区二区三区不卡免费观看 | 少妇色诱麻豆色哟哟 | 国产一区二区三区四 | 97中文 | 日日狠狠久久偷偷四色综合免费 | 香蕉视频99 | 国产资源在线免费观看 | 国产成人精品视频在线 | 特级黄色影院 | 极品国产91在线网站 | 亚洲成人在线免费 | 精品久久一区二区三区 | 国产亚洲精品久久久久婷婷瑜伽 | 91性高湖久久久久久久久网站 |