簡單介紹 ARC 以及 ARC 實現的原理

2022-09-14 08:21:11 字數 1473 閱讀 3025

簡單介紹 arc 以及 arc 實現的原理。

arc 是蘋果在 wwdc 2011 提出來的技術,因此很多新入行的同學可能對此技術細節並不熟悉。但是,雖然 arc 極大地簡化了我們的記憶體管理工作,但是引用計數這種記憶體管理方案如果不被理解,那麼就無法處理好那些棘手的迴圈引用問題。所以,這道面試題其實是考查同學對於 ios 程式記憶體管理的理解深度。

自動的引用計數(automatic reference count 簡稱 arc),是蘋果在 wwdc 2011 年大會上提出的用於記憶體管理的技術。

引用計數(reference count)是乙個簡單而有效的管理物件生命週期的方式。當我們建立乙個新物件的時候,它的引用計數為 1,當有乙個新的指標指向這個物件時,我們將其引用計數加 1,當某個指標不再指向這個物件是,我們將其引用計數減 1,當物件的引用計數變為 0 時,說明這個物件不再被任何指標指向了,這個時候我們就可以將物件銷毀,**記憶體。由於引用計數簡單有效,除了 objective-c 語言外,微軟的 com(component object model )、c++11(c++11 提供了基於引用計數的智慧型指標 share_prt) 等語言也提供了基於引用計數的記憶體管理方式。

引用計數這種記憶體管理方式雖然簡單,但是手工寫大量的操作引用計數的**不但繁瑣,而且容易被遺漏。於是蘋果在 2011 年引入了 arc。arc 顧名思義,是自動幫我們填寫引用計數**的一項功能。

arc 的想法**於蘋果在早期設計 xcode 的 analyzer 的時候,發現編譯器在編譯時可以幫助大家發現很多記憶體管理中的問題。後來蘋果就想,能不能乾脆編譯器在編譯的時候,把記憶體管理的**都自動補上,帶著這種想法,蘋果修改了一些記憶體管理**的書寫方式(例如引入了@autoreleasepool關鍵字)後,在 xcode 中實現了這個想法。

arc 的工作原理大致是這樣:當我們編譯原始碼的時候,編譯器會分析原始碼中每個物件的生命週期,然後基於這些物件的生命週期,來新增相應的引用計數操作**。所以,arc 是工作在編譯期的一種技術方案,這樣的好處是:

編譯之後,arc 與非 arc **是沒有什麼差別的,所以二者可以在原始碼中共存。實際上,你可以通過編譯引數-fno-objc-arc來關閉部分源**的 arc 特性。

相對於垃圾**這類記憶體管理方案,arc 不會帶來執行時的額外開銷,所以對於應用的執行效率不會有影響。相反,由於 arc 能夠深度分析每乙個物件的生命週期,它能夠做到比人工管理引用計數更加高效。例如在乙個函式中,對乙個物件剛開始有乙個引用計數+1的操作,之後又緊接著有乙個-1的操作,那麼編譯器就可以把這兩個操作都優化掉。

但是也有人認為,arc 也附帶有執行期的一些機制來使 arc 能夠更好的工作,他們主要是指 weak 關鍵字。weak 變數能夠在引用計數為 0 時被自動設定成 nil,顯然是有執行時邏輯在工作的。我通常並沒有把這個算在 arc 的概念當中,當然,這更多是乙個概念或定義上的分歧,因為除開 weak 邏輯之外,arc 核心的**都是在編譯期填充的。

全文完。

單例模式的實現 ARC與非ARC

單例模式是一種很重要的設計模式,在ios開發中,通過使用單例設計模式來實現在程式生命週期內只有乙個例項存在來節省記憶體開銷。下面是arc中單例模式的實現 在自定義的類.m檔案中,需要實現下列的方法 import hmaudiotool.h inte ce hmaudiotool end implem...

Block在ARC和非ARC中的使用

1 block是事先封裝好的一段 快,在需要的時候呼叫block執行 block底層是指向結構體的指標,編譯器會將block的內部 生成c語言對應的函式 2 block預設是存放在棧中的 開發人員不需要管理記憶體 儲存在棧中的block不會對引用的物件進行retain 3 非arc 對block進行...

ARC的初了解

針對記憶體管理問題,arc可以幫助管理object c物件,但是不支援core foundation 物件管理,所以轉換後要注意乙個問題,誰來釋放使用後的物件。本文重點總結一下型別轉換後的的記憶體管理 一 非arc的記憶體管理 手動管理記憶體,使用完轉換的物件,release就可以 nssting ...