iOS alloc & init 方法解析

部分源碼的下載地址集合

juejin.im/post/5e9d9a…sass

alloc 方法流程

要解析alloc方法,首先在代碼裏打下斷點app

而後咱們經過debug > Debug Workflow > Always Show Disassembly 查看其實現 函數

viewDidLoad 方法中,[TTObject alloc]這個方法實際上是調用了objc_alloc,經過對下符號斷點發現objc_alloc存在libobjc.A.dyilb庫中。post

找到objc_alloc函數的實現,咱們能夠看到alloc相關的方法,其實都調用了一個callAlloc()函數 debug

進入callAlloc()函數會執行到 __OBJC2__部分。由於canAllFast()返回值總爲false,因此代碼會走到判斷中的else部分。重點就在於class_createInstance()函數。 指針

class_createInstance()內部實際是調用了_class_createInstanceFromZone函數。在這個函數裏咱們能夠看到會對obj進行開闢空間以及初始化isa的操做code

在處理空間大小時,會通 word_alignobj進行8字節對齊處理

初始化isa,最重要的就是對cls / shiftcls的處理。 cdn

isa處理完成並放入obj中,alloc方法算是告一段落了。咱們也能夠經過指針獲取到對象。對象

init 方法流程

查看源碼發現init方法什麼都沒有作。那麼init方法爲何存在呢?就是apple留給開發者的一個處理入口,初始化對象之後對其進行自定義的修改。 blog

執行結果

都是同一個TTObject對象

相關文章
相關標籤/搜索