iOS- 再談ARC裡記憶體問題,ARC裡數組、對象記憶體得不到釋放?,ios-arc

來源:互聯網
上載者:User

iOS- 再談ARC裡記憶體問題,ARC裡數組、對象記憶體得不到釋放?,ios-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];   }

 記憶體配置圖如下

 

解決方案三:3.3.使用block封裝數組傳遞,最後做block的釋放,ARC會自動幫你釋放記憶體  block使用較為頻繁,不在本文章闡述,下次會專門寫一篇block的部落格。謝謝大家,還有什麼疑問可以評論中提出,我有時間會耐心回複!  作者: 清澈Saup
出處: http://www.cnblogs.com/qingche/
本文著作權歸作者和部落格園共有,歡迎轉載,但必須保留此段聲明,且在文章頁面明顯位置給出原文串連。

 

 

 

 

 

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.