編譯objc主要是用clang + LLVM
clang做前端 llvm優(yōu)化代碼 llvm產(chǎn)生機(jī)器碼
要盡量畫內(nèi)存圖
值類型跟隨實(shí)例在棧中,引用是在堆中
屬性是對(duì)外可以被訪問的,編譯器可以自動(dòng)產(chǎn)生get set方法 屬性本身還有一些修飾符可以定義讀寫等性質(zhì)
同時(shí)編譯器可以產(chǎn)生出一個(gè)對(duì)應(yīng)的實(shí)例變量_加property的名字
objc的實(shí)例方法都是公用的,但是如果在實(shí)現(xiàn)中放入方法,則相當(dāng)于java中的private了
objc方法是動(dòng)態(tài)調(diào)用的,即內(nèi)存的實(shí)例結(jié)構(gòu)中有指向一個(gè)methodList中的指針,methodList中又保存了方法入口的指針
對(duì)象初始化器可以有多個(gè),類型初始化器只能有一個(gè) 析構(gòu)器只能有一個(gè) new 相當(dāng)于調(diào)用了alloc/init的無參版本
類型初始化是一個(gè)進(jìn)程周期內(nèi)部只會(huì)調(diào)用一次,這是規(guī)則,如果自己實(shí)現(xiàn)了類型初始化,則如果沒有判斷self == 當(dāng)前的類型
則會(huì)被執(zhí)行兩次邏輯 子類的類型初始化器會(huì)自動(dòng)調(diào)用父類的初始化器
繼承時(shí)盡量避免在父類init和dealloc方法中調(diào)用子類重寫的方法
objc繼承時(shí)方法沒有重載只要重寫