參考:
objective-c物件之類物件和元類物件(一)
objective-c物件模型及應用
參看以上文章基本可以了解objective-c物件模型模型了,
可做學習:
1. 動態替換類方法或例項方法 method swizzling api
2. 編寫category類別
3. 動態增加屬性 objc_setassociatedobject
思考,category類別為什麼能增加方法,而不能直接增加屬性
可變與不可變
因為物件在記憶體中的排布可以看成乙個結構體,該結構體的大小並不能動態變化。所以無法在執行時動態給物件增加成員變數。
相對的,物件的方法定義都儲存在類的可變區域中。objective-c 2.0並未在標頭檔案中將實現暴露出來,但在objective-c 1.0中,我們可以看到方法的定義列表是乙個名為 methodlists的指標的指標(如下圖所示)。通過修改該指標指向的指標的值,就可以實現動態地為某乙個類增加成員方法。這也是category實現的原理。同時也說明了為什麼category只可為物件增加成員方法,卻不能增加成員變數。
需要特別說明一下,通過objc_setassociatedobject 和 objc_getassociatedobject方法可以變相地給物件增加成員變數,但由於實現機制不一樣,所以並不是真正改變了物件的記憶體結構。
除了物件的方法可以動態修改,因為isa本身也只是乙個指標,所以我們也可以在執行時動態地修改isa指標的值,達到替換物件整個行為的目的。不過該應用場景較少。
Objective C類,物件,方法
objective c採用特定的語法對類和例項應用方法 classorinstance method 左方括號後要緊跟類的名稱或者該類的例項名稱,它後面可以是乙個或多個空格,空格後面是將要執行的方法。最後,使用右方括號和分號來終止。請求乙個實力或類執行某個操作時就是在向它發生一條訊息。import ...
1 類與物件之objective c
1.objc跟 c的區別與聯絡 首先objc是乙個物件導向的語言 封裝 繼承 多型 objc相當於c的乙個超集即objc允許使用任何c語言 但增加了許多c沒有的特點bigger easier 2.objc中的類與物件 類由介面 xx.h inte ce 和實現 xx.m implementation...
1 類與物件之objective c
1.objc跟c的區別與聯絡 首先objc是乙個物件導向的語言 封裝 繼承 多型 objc相當於c的乙個超集即objc允許使用任何c語言 但增加了許多c沒有的特點bigger easier 2.objc中的類與物件 類由介面 xx.h inte ce 和實現 xx.m implementation ...