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

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];
   
}

 內存圖以下oop

 

解決方法三:

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

block使用較爲頻繁,不在本文章闡述,下次會專門寫一篇block的博客。
謝謝你們,還有什麼疑問能夠評論中提出,我有時間會耐心回覆!
 
 
做者:  清澈Saup
出處:  http://www.cnblogs.com/qingche/
本文版權歸做者和博客園共有,歡迎轉載,但必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接。
相關文章
相關標籤/搜索