- 當你給對象發送消息時,消息是在尋找這個對象的類的方法列表。
- 當你給類發消息時,消息是在尋找這個類的元類的方法列表。
- 元類是必不可少的,因為它存儲了類的類方法。每個類都必須有獨一無二的元類。
- 所有的元類都使用根元類(繼承體系中處于頂端的類的元類)作為他們的類。
- 這就意味著所有NSObject的子類(大多數類)的元類都會以NSObject的元類作為他們的類
isa指針
- 實例對象的isa --> 類
- 類的isa指針 --> 元類
- 元類的isa指針 -->根元類
- 根類的isa指針 -->根元類
- 根元類的isa指針 --> 根元類自己
superclass指針
- 實例對象 --> 無superclass
- 類的superclass指針 --> 父類
- 根類superclass指針 --> nil
- 元類superclass指針 --> 元類的基類的父類的元類
- 根元類superclass指針 --> 根元類的基類
Greg Parker給出了一份精彩的元類,類,實例對象圖譜來展示這些關系
詳解 Objective-C 中的 Runtime
深入Objective-C的動態特性
初學 Objective-C 時把[receiver message]當成簡單的方法調用,而無視了“發送消息”這句話的深刻含義。其實[receiver message]會被編譯器轉化為:
objc_msgSend(receiver, selector)
如果消息含有參數,則為:
objc_msgSend(receiver, selector, arg1, arg2, ...)