runtime - 屬性與成員變量

利用運(yùn)行時(shí)runtime機(jī)制,我們可以獲取類文件的屬性或者成員變量,還可以為類(當(dāng)然包括某些分類)動(dòng)態(tài)添加屬性或者成員變量,要知道蘋果是不允許我們用普通方法為分類增加屬性的,但是通過運(yùn)行時(shí)我們就可以做到。

獲取類屬性或者成員變量:

首先有幾個(gè)相關(guān)的API要弄明白:

/** 獲取類所有通過@property方式聲明的成員變量或者屬性(參數(shù)1:要獲取成員變量或者屬性的類,參數(shù)2:unsigned int變量的指針地址,用來存放獲取到了多少個(gè)成員變量) */
objc_property_t *class_copyPropertyList(Class cls, unsigned int *outCount)

/** 獲取類所有通過@property以及在@interface大括號里邊聲明的成員變量或者屬性(參數(shù)1、2傳入?yún)?shù)同上) */   
Ivar *class_copyIvarList(Class cls, unsigned int *outCount)

有關(guān)這兩個(gè)方法的區(qū)別,請參考這里

首先我們新建一個(gè)PropertyTest類,在.h文件中聲明幾個(gè)成員變量和屬性

{
    float _webSiteTitle;
    float _privateName;
    float _privateAttribute;
}
@property (nonatomic, assign) int count;
@property (nonatomic, weak) id delegate;
@property (nonatomic, copy) NSString *title;
@property (nonatomic, strong) NSArray *names;
@property (nonatomic, strong) NSNumber *atomicProperty;

.m文件中,獲取類所有成員變量以及屬性

// 獲取所有通過@property方式聲明的屬性
- (void)getAllProperties 
{
    unsigned int count = 0;
    objc_property_t *pros = class_copyPropertyList([self class], &count);
    
    for (unsigned int i=0; i<count; i++) {
    objc_property_t pro = pros[i];
    
    // 'property_getName'獲取屬性名稱
    const char *proName = property_getName(pro);
    
    // 'property_getAttributes'獲取屬性具體描述
    const char *proAttr = property_getAttributes(pro);
    
    NSLog(@"proName:%s proAttr:%s", proName, proAttr);
    
    unsigned int aCount = 0;
    objc_property_attribute_t *attrs = property_copyAttributeList(pro, &aCount);
        for (int j=0; j<aCount; j++) {
            objc_property_attribute_t attr = attrs[j];
            // 'objc_property_attribute_t'是個(gè)結(jié)構(gòu)體,包含'value' 和 'name'兩個(gè)值
            const char *attrName = attr.name;
            const char *attrValue = attr.value;
            NSLog(@"proName:%s value:%s", attrName, attrValue);
        }
        // 用完之后一定記得手動(dòng)釋放,否則會(huì)造成內(nèi)存泄漏
        free(attrs);
    }
    free(pros);
} 

// 獲取所有屬性(包括通過在` {} `里邊聲明的,以及通過@property方式聲明的)
- (void)getAllMemberVariables
{
    unsigned int count = 0;
    Ivar *ivars = class_copyIvarList([self class], &count);
    
    for (unsigned int i=0; i<count; i++) {
        Ivar ivar = ivars[i];
        const char *name = ivar_getName(ivar);
        const char *type = ivar_getTypeEncoding(ivar);
        NSLog(@"IvarsName:%s encodeType:%s", name, type);
    }
        free(ivars);
}

+ (void)test
{
    PropertyTest *test = [[PropertyTest alloc] init];
    [test getAllProperties];
}

首先我們來看下 getAllProperties 方法打印的結(jié)果:

打印結(jié)果如下:

讓我們來分析下打印結(jié)果(第1、2、3和4行是一個(gè)屬性)(這里我們只分析一個(gè)屬性的情況,因?yàn)槠渌闆r類似):

第一行:
proName(屬性名):count  proAttr(屬性包含的特性):Ti,N,V_count
第二、三和四行:
分別是對第一行中proAttr的詳細(xì)解釋包括屬性名和屬性值。

那么第一行中打印的proAttr屬性名和屬性值分別代表什么呢?我們再來分析,根據(jù)蘋果官方文檔,一個(gè)屬性的attribute這樣組成: T, ... ,V_屬性名
其中 *1、T表示屬性類型,比如int類型為Ti,id類型為T@,NSString類型為T@"NSString"
    2、中間的...根據(jù)不同類型的屬性而定義為不同的值,比如'N'表示聲明為conatomic,'C'表示屬性聲明為copy,'&'表示聲明為retain... 以此類推
    3、V_屬性名 表示實(shí)例變量?

更詳細(xì)的情況可以參考蘋果官方文檔的解釋

我們再看下通過方法 getAllMemberVariables 打印的結(jié)果:

由打印結(jié)果我們可以看出,這個(gè)方法打印出了我們定義的所有屬性以及成員變量,其中每一行的
第一個(gè)參數(shù):_屬性或者成員變量名稱  
第二個(gè)參數(shù):表示變量類型,比如float類型為'f',int類型為'i',NSString類型為'@NSString'... 以此類推

更詳細(xì)的情況可以參考蘋果官方文檔的解釋

有了這兩個(gè)方法,那么我們在動(dòng)態(tài)地獲取某個(gè)類的變量的時(shí)候就方便了很多,相似的,runtime中也有獲取類的方法(method)、協(xié)議(protocol)等列表的API,有興趣的朋友可以去學(xué)習(xí)下

Demo地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 對于從事 iOS 開發(fā)人員來說,所有的人都會(huì)答出【runtime 是運(yùn)行時(shí)】什么情況下用runtime?大部分人能...
    夢夜繁星閱讀 3,812評論 7 64
  • 這篇文章完全是基于南峰子老師博客的轉(zhuǎn)載 這篇文章完全是基于南峰子老師博客的轉(zhuǎn)載 這篇文章完全是基于南峰子老師博客的...
    西木閱讀 30,892評論 33 466
  • 參考鏈接: http://www.cnblogs.com/ioshe/p/5489086.html 簡介 Runt...
    樂樂的簡書閱讀 2,249評論 0 9
  • 我們常常會(huì)聽說 Objective-C 是一門動(dòng)態(tài)語言,那么這個(gè)「動(dòng)態(tài)」表現(xiàn)在哪呢?我想最主要的表現(xiàn)就是 Obje...
    Ethan_Struggle閱讀 2,338評論 0 7
  • 三荷聽雨聲閱讀 154評論 0 1

友情鏈接更多精彩內(nèi)容