重新認識ARC

2021-07-25 22:32:29 字數 1355 閱讀 3265

雖然用了很久的arc,感受了**簡潔。但是對arc底層實現並不了解。

今天抽空研究了下,做些簡單地總結。

一、__strong

1.區域性變數

①.對於區域性變數來說,在超出作用域的地方由編譯器自動插入release。

==>>  (大概轉化為)

②.在非arc返回的autorelease型別的方法

==> (在blog手碼大概**,如有錯誤還望指出)

這裡比①多了一步 objc_retainautoreleasereturnvalue(objc);對autorelease型別做了乙個不retain。

我們來猜測[nsmutablearray array] 內部的實現

+(id)array

==> 轉化後

這裡邊對tmp做了objc_autoreleasereturnvalue操作,這個操作跟objc_autorelease()是有區別的。objc_autoreleasereturnvalue會檢查命令棧(具體叫什麼名字有點迷糊了)如果發現緊接其後呼叫了objc_retainautoreleasereturnvalue方法,就不會將tmp加入到autoreleasepool中。而objc_autorelease會直接把物件放入到pool中。

所以:類方法返回的物件如果被__strong修飾,其實並沒有加入到pool中,算是編譯器優化~

2.例項變數

我以前一直以為是在dealloc中被arc插入release的。後來發現是編譯器利用了c++的乙個特性。c++生成了個***destu..(這個

檔名記不清

楚了,稍後補上),編譯器會在這裡處理例項變數的釋放。當然按照之前的理解也沒什麼大礙~~

二、__weak

被__weak修飾的變數,被加入到weak表中,以它所指向的物件的位址作為key。在物件被釋放時,會將weak表中的所有註冊weak變數移除並置為nil。

①.被宣告時

==>>

其中objc_initweak跟objc_destoryweak內部都是使用的objc_storeweak();

objc_initweak

==>>  

對應的objc_destoryweak

==>>

__weak在被宣告時,通過objc_storeweak加入到登錄檔中。

②.在被使用時

==>>

可以看到在使用__weak修飾的變數時,會使用乙個中間變數retain一次,然後再加入到autoreleasepool。如果多次使用,就會生成大量的autorelease

物件到pool

中。作為優化,可使用 id __strong sobjc = wkobjc.

後記:有紕漏再補充~

重新認識ARC

雖然用了很久的arc,感受了 簡潔。但是對arc底層實現並不了解。今天抽空研究了下,做些簡單地總結。一 strong 1.區域性變數 對於區域性變數來說,在超出作用域的地方由編譯器自動插入release。大概轉化為 在非arc返回的autorelease型別的方法 在blog手碼大概 如有錯誤還望指...

重新認識container

我還清楚的記得,第一次從 那兒聽說container這個詞 結果他給我解釋了半天還是似懂非懂的。今天,偷閒翻了下posa4,發現裡面對container的解釋特別清楚。粗略的理解下來是,為了分離關注點,而實現的對系統資源的封裝。豁然開朗的發現,os就是應用程式的container。突發奇想的,開發乙...

重新認識測試

以前總覺得測試是軟體開發的邊緣職位,開發人員才是軟體生命週期的核心人員。隨著對網際網路公司的了解,逐步了解到測試的重要性。以bat為例,三家公司均設定了測試開發工程師崗位,該崗位的主要職責就是編寫自動化測試案例,通過對 的邏輯進行分析,設計出能夠覆蓋大部分 的測試用例。如阿里的測試開發工程師的崗位描...