1. 程式人生 > >iOS ARC下的記憶體管理問題以及解決辦法

iOS ARC下的記憶體管理問題以及解決辦法

很多同學因為沒有經歷過使用手動引用計數來管理記憶體,一直在ARC下愉快的開發導致對iOS記憶體管理方式的不理解,巧哥有篇專門說明iOS記憶體管理,我也是記錄學習中的點滴,共勉之。

我剛接觸iOS的時候ARC已經出現,但是大家對這種黑科技都保持懷疑態度,大部分人還是在使用手動管理記憶體,後來Xocde預設ARC模式才開始快速推廣並被大家所認可。

ARC模式下雖然很好的解決手動管理記憶體的問題,但是還是有瑕疵的:1.物件間的迴圈引用;2.Core Foundation底層類庫的物件需要手動管理記憶體;

物件間的迴圈引用

迴圈引用就是兩個(或多個環形)物件都同時持有對方造成引用的物件不能釋放導致記憶體洩漏; 解決方法有兩個:1.手動顯示斷開引用;2.物件的弱引用(weak);

手動顯示斷開引用

這種方法是在程式設計師知道哪裡會出現迴圈引用,在合適的位置把物件釋放(nil)以此來結束迴圈引用釋放所有相關物件。

物件的弱引用(weak)

在iOS裡有強引用和弱引用之分,宣告成員變數Strong是強引用,Weak是弱引用;強引用是當前物件釋放的時候會同事釋放因為當前物件持有這個變數;弱引用是不被當前物件持有的,在當前物件被釋放的時候這個變數會設定成nil,這樣也避免了向已經銷燬的物件傳送訊息產生崩潰的問題。 大家現在都喜歡使用block,大量的block容易產生迴圈引用,使用弱引用:__weak ViewController *weakSelf = self 在宣告delegate的時候,使用Weak來修飾;
這些都可以解決在開發中遇到的迴圈引用問題。

Core Foundation底層類庫的物件記憶體管理

iOS的底層類庫Core Foundation的物件不支援ARC,在使用的時候就需要我們自己手動控制了;例如:CGColorRef,CFFountRef這些要使用CGColorRetain+1、CGColorRelease-1;
CGColorSpaceRef cmykSpace = CGColorSpaceCreateDeviceCMYK();
        CGFloat cmykValue[] = {1, 1, 0, 0, 1};      // blue
        CGColorRef colorCMYK = CGColorCreate(cmykSpace, cmykValue);
        CGColorSpaceRelease(cmykSpace);
        CGColorRetain(colorCMYK);
        CGColorRelease(colorCMYK);
        NSLog(@"colorCMYK: %@", colorCMYK);

如果使用CGColor物件轉換成OC物件引入的有關鍵字bridge,大家可以檢視相關資料;

Xcode檢測迴圈引用

Xcode的內建工具Leaks可以讓我們發現程式裡的記憶體洩漏,Product——>Profile,選擇Leaks,確認Choose,啟動模擬器.

再次選擇Profile

上圖小紅X就是說明有迴圈引用的問題,雙擊標記2的地方會直接進入錯誤程式碼位置。 雖然現在大家都使用ARC但是也要知道記憶體管理相關的知識,這些是開發的基礎,大家一起學習吧!