在oc中,成員變數就是乙個結構體,如下:
struct objc_ivar
這個結構體描述了成員變數的名字,型別和偏移量。
同時runtime也為我們提供了相應的函式來獲取類的成員變數的資訊。
ivar _nonnull * _nullable
class_copyivarlist
(class _nullable cls,
unsigned
int* _nullable outcount)
;//獲取成員變數列表
const
char
* _nullable
ivar_getname
(ivar _nonnull v)
;//獲取成員變數名
const
char
* _nullable
ivar_gettypeencoding
(ivar _nonnull v)
;//獲取成員變數型別
ptrdiff_t
ivar_getoffset
(ivar _nonnull v)
;//獲取成員變數偏移量
接下來,我們舉個例子來演示一下如何用runtime獲取成員變數的相關資訊。
首先,我們定義乙個person類,這個類有三個成員變數。
@inte***ce person : nsobject
@property
(nonatomic,assign) nsinteger age;
@property
(nonatomic,strong) nsdictionary * dict;
@end
然後,我們獲取該類,並列印出該類成員變數的資訊。
#import
#import "person.h"
#import
intmain
(int argc,
const
char
* ar**)
free
(ivars);}
return0;
}
列印結果如下:
2021-03
-1623:
17:07.489178
+0800 project3[
43237
:4167326
] person class address:
0x100008230
2021-03
-1623:
17:07.489533
+0800 project3[
43237
:4167326
] ivar_name : _name, ivar_type :
@"nsstring"
, diff :
8.2021-03
-1623:
17:07.489571
+0800 project3[
43237
:4167326
] ivar_name : _age, ivar_type : q, diff :
16.2021-03
-1623:
17:07.489591
+0800 project3[
43237
:4167326
] ivar_name : _dict, ivar_type :
@"nsdictionary"
, diff :
24.program ended with exit code:
0
從結果中我們可以看到,類person的基位址為0x100008230,並且每個成員相對於基位址有8個位元組的偏移。並且每個成員變數都有ivar_name、ivar_type、ivar_offset屬性。從而可以證明:成員變數就是乙個結構體! runtime獲取屬性和成員變數方法
成員變數 1 成員變數的定義 ivar 例項變數型別,是乙個指向objc ivar結構體的指標 typedef struct objc ivar ivar 2 相關函式 獲取所有成員變數 class copyivarlist 獲取成員變數名 ivar getname 獲取成員變數型別編碼 ivar ...
iOS 用runtime為分類新增成員變數或屬性
關於ios分類 很多說法是只能新增方法,而不能新增成員變數或屬性。有些人可能知道,這種說法是不嚴謹的,並不是絕對不能新增變數。解釋如下 我們知道在乙個類中用 property宣告屬性,編譯器會自動幫我們生成 成員變數和setter getter,但分類的指標結構體中,根本沒有屬性列表。所以在分類中用...
runtime 對成員變數操作應用之歸檔和返歸檔
為了實現歸檔和返歸檔,我們要讓被歸檔物件的類接受nscoding協議並且實現協議裡的兩個方法 void encodewithcoder nscoder acoder nullable instancetype initwithcoder nscoder adecoder ns designated ...