iOS另類的記憶體管理,iOS另類記憶體管理

來源:互聯網
上載者:User

iOS另類的記憶體管理,iOS另類記憶體管理

iOS的記憶體管理算是老生常談的問題了,我們寫iOS的時候無時無刻不在涉及到記憶體管理。從開始的MRR(manual retain-release)到後來ARC(Automatic Reference Counting),包括CoreFoundation的記憶體管理都遵守引用計數的基本原則。

基本的記憶體管理大家肯定都很熟悉,在這裡主要說一點,其餘的就不多說了。官方文檔有這樣的一段話

- You own any object you create

You create an object using a method whose name begins with “alloc”, “new”, “copy”, or “mutableCopy” (for example, alloc, newObject, or mutableCopy).

大意就是說,如果你使用alloc/new/copy/mutableCopy這些開頭的方法建立了一個對象,那麼你就會擁有這個對象(retain)。當你不用的時候,你就需要手動的去release一次。

舉一個例子,假設有一個方法,[STObject newObject]

我們應該這麼使用,如果我們最後不release,就會導致Object被泄漏。

123 STObject *object = [STObject newObject];// do something[object release];
 

既然這樣的話,我們也可以想象出如果我們要自己實現new開頭的方法,我們需要如下代碼

1234567 - (instancetype)newObject {    return [[[self class] alloc] init];} + (UIButton *)copyButton {    return [[UIButton buttonWithType:UIButtonTypeCustom] retain];}

那麼就產生了以下幾個問題:

我們可以自己編寫以上的實驗代碼,然後測試。

最終測試結果如下:

  • 情境1,3下運行正常
  • 情境2下會crash
  • 情境4下產生記憶體泄露

為什麼情境2會crash呢?這是由於ARC下我們編譯器如果看到你是以alloc/new/copy/mutableCopy等開頭的方法建立了對象,則會在使用的最後插入一次release操作,由於返回的是autorelease的對象,又被release了一次,所以導致野指標。

情境4產生泄漏的原因也是一樣,ARC下編譯器發現該方法是new等開頭的時候,方法結束的時候不會插入release語句,情境4使用的過程中,沒有對newObject進行release,所以會產生泄漏。

如果我們僅使用MRR或者ARC的話,這種問題一般不會出現。這種問題的出現一般是當ARC/MRR混編的時候,由於一些編寫的不規範導致的,所以在寫代碼的過程中,遵守規範是很有必要的

如果我們自己編寫alloc/new/copy/mutableCopy開頭的方法的時候,MRR下一定不要忘了返回retain的對象,同樣當我們使用alloc/new/copy/mutableCopy的方法建立對象的時候,也不能忘了在用完之後release。

如果我們有一段MRR的代碼,提供了一個new開頭的方法但是沒有遵守規範,我們ARC下該怎麼辦呢?按照上面的結論,我們正常使用肯定會導致野指標的

在這裡呢,如果能改代碼當然把代碼都改成遵守規範的最好,如果不能改源碼的話,我們只能修改使用方。在這裡提供一種方法:

12 SEL selector = NSSelectorFromString(@"copyObject");STObject *object = (STObject *)[STObject performSelector:selector];

大家可以嘗試一下,然後思考一下為什麼。

關於iOS的記憶體管理遠遠不止這些,本文中說的大家實際編碼的過程中也很少遇到,僅僅當作知識的補充吧~

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.