要解析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_align
對
obj
進行8字節對齊處理
初始化isa
,最重要的就是對cls / shiftcls
的處理。 cdn
在isa
處理完成並放入obj
中,alloc
方法算是告一段落了。咱們也能夠經過指針獲取到對象。對象
查看源碼發現init
方法什麼都沒有作。那麼init方法爲何存在呢?就是apple留給開發者的一個處理入口,初始化對象之後對其進行自定義的修改。 blog
都是同一個TTObject對象