iOS 用runtime為分類新增成員變數或屬性

2021-09-11 21:31:21 字數 1028 閱讀 2775

關於ios分類:很多說法是只能新增方法,而不能新增成員變數或屬性。有些人可能知道,這種說法是不嚴謹的,並不是絕對不能新增變數。 解釋如下: 我們知道在乙個類中用@property宣告屬性,編譯器會自動幫我們生成_成員變數和setter/getter,但分類的指標結構體中,根本沒有屬性列表。所以在分類中用@property宣告屬性,既無法生成_成員變數也無法生成setter/getter。 因此結論是:我們可以用@property宣告屬性,編譯會通過,但run之後就會崩潰。

那麼問題來了。。 既然報錯的根本原因是使用了系統沒有生成的setter/getter方法,可不可以在手動新增setter/getter來避免崩潰,完成呼叫呢?其實是可以的。由於oc是動態語言,方法真正的實現是通過runtime完成的,雖然系統不給我們生成setter/getter,但我們可以通過runtime手動新增setter/getter方法。那具體怎麼實現呢?

舉例如下: 分類.h

@inte***ce customview (dd)

- (nsstring *)name;

- (void)setname:(nsstring *)name;

@end

複製**

分類.m

@implementation customview (dd)

/* * 使用關聯物件模擬例項變數

* 使用objc_getassociatedobject、objc_setassociatedobject模擬『屬性』的訪問方法

*/- (nsstring *)name

- (void)setname:(nsstring *)name

@end

複製**

重點就是兩個runtime實現方法,如果不寫這個,只要你申明了屬性,執行肯定會報錯;如果加了這兩個方法,就能正常使用。 關聯策略的解釋如下:

typedef objc_enum(uintptr_t, objc_associationpolicy);

複製**

iOS分類中通過runtime新增動態屬性

1.先建立乙個類 property assign,nonatomic nsinteger age void run end import person.h implementation person void run end2.定義分類 import person.h inte ce person ...

iOS分類中通過runtime新增動態屬性

這個的話並不是說 可以 在程式執行的時候 來幾個 未知的東西 就新增什麼 1 2 3 4 5的屬性。而是可以在系統原有類的基礎上 給那個類 集合實際的工程來新增你方便實用的東西。比如 乙個 label 有 乙個 backgroundcolor屬性,我要給它新增乙個 其他的 比如 文字 第乙個字的co...

iOS為類別新增屬性的方法 RunTime

一般認為category不能新增變數,其實系統已經告訴我們是可以的.這傢伙已經給uiviewcontroller新增了圖中的幾個屬性,那麼如何實現?其實是使用 dynamic 來動態新增的。即執行時 runtime 1.建立person類 import inte ce person nsobject...