oc的category是乙個非常好用的特性,它允許你在不改變原始碼的情況下擴充套件類的一些功能特性,從而能更好地組織你地**。
但是使用category有乙個很大地限制,不能在category裡新增成員變數,
這個限制較大地限制了category的使用,當然使用extension可以往類裡面新增成員變數,但是extension要求你需要在original class 的實現類裡面實現extension所新增的方法。所以extension不可能對拿不到原始碼的框架進行擴充套件。
對於category不能新增成員變數的限制,下面我們介紹乙個很巧妙的方法來解決:使用runtime庫的objc_setassociatedobject / objc_getassociatedobject 函式來解決。
objc_setassociatedobject 的定義:
objc_getassociatedobject 的定義:
可以看出objc_setassociatedobject 就是將乙個物件跟另乙個物件進行關聯,並用乙個key來標示,objc_getassociatedobject 就是用這個key來拿到與receiver相關聯的乙個物件。
objc_setassociatedobject / objc_getassociatedobject 來在category裡新增成員變數非常簡單,請看下面的乙個簡單的例子:
注意:必須使用@dynamic來讓編譯器知道我們自己實現setter/getter方法
不能使用@synthesize(也不能@dynamic 和@synthesize都不寫,什麼都不寫在最新的xcode裡是預設@synthesize),@synthesize會自動生成成員變數,並自動生成setter/getter方法。
最後,objc_setassociatedobject 的關聯的policy 可以根據自己的需求使用,這個例子使用objc_association_retain_nonatomic來標示乙個strong reference來指向被關聯的物件。
Category支援新增成員變數
一 類別的作用?分類 category 是有名稱的,分類可以在不修改原來類模型的基礎上拓充方法,不能擴充成員變數 3個作用 1 將類的實現分散到多個不同檔案或多個不同框架中。並且如果類別和原來類中的方法產生名稱衝突,則類別將覆蓋原來的方法,因為類別具有更高的優先順序。分類依賴類而存在,沒有類也就沒有...
Category新增屬性與成員變數
category是objective c中常用的語法特性,通過它可以很方便的為已有的類來新增函式。但是category不允許為已有的類新增新的屬性或者成員變數。一種常見的辦法是通過runtime.h中objc getassociatedobject objc setassociatedobject來...
為category新增屬性和成員變數
category可以在不改變類結構的情況下為已有的類新增方法,但是category不執行新增屬性和成員方法,這可以用中的 objc setassociatedobject idobject,const void key,idvalue,objc associationpolicy policy 和 ...