1.1 objective-c中的内存管理
備注:本來在一年前有一個出版社找到我,讓我寫一系列關于iOS性能優化的書。但是一直因為工作原因,沒有能夠按時交付。(其實就是自己懶)所以現在講已經寫好的部分章節分享到博客中,希望對大家有所幫助,如果有什么不對的地方,也希望大家指正出來,大家共同討論。也可以加我qq:1583042987,備注寫上博客園,大家一起討論一下關于iOS的技術。好了,進入正文。
想要了解objective-c中的內存管理,首先需要知道引用計數的概念,那什么是引用計數?很多初學者對此的了解都局限于概念,并沒有真的理解。那接下來用一個例子來解釋這一個抽象的概念。
在學校的圖書館里,有一個班級組織閱讀活動,圖書館此時對該班級開發,每一名學生都去圖書館借用一到多本書,此時學生持有的資源也就是書的數量,而圖書館對于班級的每個人員的借書情況都進行了紀錄,當學生閱讀結束后,需要將書的資源釋放,歸還給圖書館,當所有學生都將書歸還的時候,即代表這次閱讀活動結束,圖書館將關閉對該班級的資源使用開發,直到下次請求。那這里面需要思考幾個問題:-,當圖書館關閉資源開放,而學生還沒有盡數歸還書籍時,會造成什么樣的問題?二,如果學生們都還完書,但是圖書館再次向學生所要書籍資源時會出現什么問題?
這是項目內存管理方面兩個最為常見的問題,第一個問題稱之為“內存泄漏”,意思是沒有廢棄或者說沒有釋放已不再使用的內存資源,第二個問題稱之為“過度釋放”,意思是再次釋放已經釋放掉的內存資源。這兩個問題最為嚴重的是第一種,因為其并不會拋出什么異常,這樣的結果將導致內存的不合理分配,極大程度上的影響app性能,而第二種往往會導致程序崩潰(crash),崩潰情況為再度廢棄已經廢棄的對象時崩潰,訪問已經廢棄的對象時崩潰,以下代碼將展現過度釋放問題。
???????????? /*
???? ??? ??????* 開辟內存空間,生成并持有對象
??? ???????? ?*/
?? ????????? ?id obj = [[NSObject alloc]init];
?? ????? ????/*
?? ????????? ?* 釋放obj對象
??? ???? ??? ?*/
??? ???????? [obj release];
?? ? ???????? /*
?? ? ???????? ?* 過度釋放對象,程序將拋出異常
?? ????? ????*/
???????????? ??[obj release];
?? ???????????控制臺輸出日志:malloc: *** error for object 0x7fa3e86102c0: pointer ?????????????being freed was not allocated
???????? *** set a breakpoint in malloc_error_break to debug
為解決這兩個問題,編寫者必須明確對象的使用周期,如事例所示,在圖書館至少存在一名學生使用圖書資源時保持開放狀態,而在無人借書時保持關閉狀態。其運行邏輯為。當班級組織閱讀活動時,管理員(編寫者)向圖書館請求內存資源。之后有學生前來借書,管理員對該學生進行紀錄并分配其內存資源。活動結束后,學生們歸還圖書,管理員對學生歸還情況進行紀錄,釋放其持有資源。最后歸還圖書時,管理員確認之后,關閉對資源的開放。為了能夠很好的紀錄學生的借還情況,這里面引入了一個管理員的計數技術用以計算可用的圖書資源,以及使用資源情況。接下來再透過這個例子的延伸解釋這一技術的運作實現。班級向圖書館發送使用圖書資源的請求,第一名學生向圖書館借書,資源計數加1。計數值從0變為1,因此要開放資源。第二名學生向圖書館借書,需要資源加1。計數值由1變成2。第三名學生再次向圖書館借書,需要資源再次加1。計數變成3,第四名,第五名依次類推成n。當有學生首先完成閱讀之后,需要歸還書籍,每歸還一本圖書時計數減1,那么當第一名學生歸還時,計數由n減1。直到最后一名學生歸還書籍的時候,計數變為0,圖書館關閉對于此次活動的資源開放。如圖1.1所示。
?
?
??????????????????????????? ?圖1.1? 引用計數演示圖
通過上例可以知道,計數技術可以更加明確資源使用情況,進而更好的管理內存。在objective-c中,內存就是這個圖書館,而學生則被成為“對象的使用環境”,班級活動就是對象,每個圖書館內的圖書都是有限的,計算機的資源也是一樣,所以盡可能的有效使用資源顯得尤為重要。那么在objective-c是怎么處理這些事情呢?
在iOS中可以分為MRC(Manual Retain Release.手動釋放),以及iOS 5之后引入的ARC(Automatic Reference Counting,自動引用計數),兩種內存管理機制。而在Mac OS X 10.8系統之前還有“Garbage Collector”(垃圾回收機制),但這里面的回收機制與java中的并不相同,它是后臺有一個線程負責檢查已經不再使用的對象,然后釋放,這就會帶來兩個很大的問題,一個是由于線程一直運行,會影響到cpu的使用效率,二是會造成內存釋放遲緩,或者內存泄漏。
本節簡單的介紹了一下objective-c的內存管理,了解了引用計數,以及管理的幾種方式,接下來將著重地對內存管理進行分塊式詳細講解。
轉載于:https://www.cnblogs.com/xuruofan/p/5759956.html
總結
以上是生活随笔為你收集整理的1.1 objective-c中的内存管理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 手机是如何实现自动对焦的?
- 下一篇: Java博客集锦