雖然用了很久的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為例,三家公司均設定了測試開發工程師崗位,該崗位的主要職責就是編寫自動化測試案例,通過對 的邏輯進行分析,設計出能夠覆蓋大部分 的測試用例。如阿里的測試開發工程師的崗位描...