runtime之成員變數

2021-10-22 10:51:17 字數 2002 閱讀 9128

在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 ...