自動的引用計數(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 特性。code
二、相對於垃圾回收這類內存管理方案,ARC 不會帶來運行時的額外開銷,因此對於應用的運行效率不會有影響。相反,因爲 ARC 可以深度分析每個對象的生命週期,它可以作到比人工管理引用計數更加高效。例如在一個函數中,對一個對象剛開始有一個引用計數 +1的操做,以後又緊接着有一個 -1 的操做,那麼編譯器就能夠把這兩個操做都優化掉。對象
可是也有人認爲,ARC 也附帶有運行期的一些機制來使 ARC 可以更好的工做,他們主要是指 weak 關鍵字。weak 變量可以在引用計數爲 0 時被自動設置成 nil,顯然是有運行時邏輯在工做的。我一般並無把這個算在 ARC 的概念當中,固然,這更可能是一個概念或定義上的分歧,由於除開 weak 邏輯以外,ARC 核心的代碼都是在編譯期填充的。生命週期
更多:iOS面試題合集內存