OC中記憶體管理問題之引用計數,oc記憶體管理

來源:互聯網
上載者:User

OC中記憶體管理問題之引用計數,oc記憶體管理

定義一個Person類

其實引用計數這個問題大家可以理解為租房子的問題, 如果有retain alloc 代表這個人租了這間大房子, 拿到了一把鑰匙, 引用計數代表房子一共有的鑰匙的數量, release代表退房歸還鑰匙

        Person * p = [[Person alloc] init];//房東蓋好了一間房子, 現在是房東一個人

        //alloc 開闢空間,引用計數由0變為1

        //retainCount,用於查看對象的引用計數

        NSLog(@"%lu", [p retainCount]);

       Person * p1 = [p retain];// retain一次, 代表又來一個人租房

       NSLog(@"p1 = %lu", [p1 retainCount]);//引用計數1-2

        NSLog(@"%lu", [p retainCount]);//引用計數1-2

Person * p2 = p1;//沒有retain 也沒有alloc 引用計數不變. 就相當於p1帶他的朋友來住,朋友沒有鑰匙的

//release 減少引用計數(歸還鑰匙)

        [p release];//引用計數2-1

[p release];//引用計數1-0(但是如果我們去輸出的話, 可能是會顯示崩潰, 或者是1, 原因如下:)

NSLog(@"%lu", [p retainCount]);// 首先這樣寫肯定是不對的 , 最後一次release,系統已經回收掉這塊記憶體,空間已經還給系統,空間已經不歸你管理,如果此時在訪問,就訪問了一塊沒有所有權的空間,所以下面的操作可能會出現野指標問題

我們還以上面的租房子問題為例, 現在這間房子最後一個人已經走了, 已經沒有人住了, 按說鑰匙已經全部交上去了, 但是我們現在的操作就像是又拿著他的鑰匙去開那個門, 這是非常不安全的.那為什麼有時候會崩潰而有時候可以列印出1呢, 這是因為如果這塊記憶體別人還沒有使用, 就像是房子還沒有租出去, 你再回去拿鑰匙開門還是安全的, 但是如果這間房子又已經租出去, 即已經有別的資料在使用這塊記憶體, 那你再回去開門, 那你的處境是相當的不安全有木有???

[p release];//野指標問題 +過渡釋放,這個也很好理解, 大家可以理解成有房客拿一把鑰匙, 不但要開門, 還要拿著這個鑰匙再去歸還一次, 要房東再次退房子押金, 違法了, 直接崩~


記憶體問題其實除了上面提到的野指標和過度釋放, 還有一個, 那就是記憶體泄露, 記憶體泄露我們可以理解為, 一為租客租房子最後鑰匙沒有歸還, 這樣房東也沒有辦法開啟這間房子, 這間房子就沒有辦法再租出去, 導致記憶體浪費, 當然, 房東在有別的房子出租的時候, 對於他來講並沒有太大的影響, 但是一旦這樣的房客有好多,房子不夠租, 房東掙錢會越來越慢, 最終可能導致做不下去~

本文只是個人對記憶體引用計數的一些理解 有什麼不對的地方, 大家多多指出~

聯繫我們

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