iOS反射機(jī)制: objc_property_t的使用

objc_property_t在實(shí)際開(kāi)發(fā)中用得還是比較多的,例如需要獲取一個(gè)注冊(cè)類的屬性,或者判斷屬性的類型,再或者獲取屬性之后自動(dòng)給其賦值等等

這里舉個(gè)獲取注冊(cè)類的所有屬性的例子,代碼如下:

//獲取類的所有屬性名
- (NSArray*)getPropertieNamesByObject:(id)object
{
    
    unsigned int outCount, i;
    
    // 獲取注冊(cè)類的屬性列表,第一個(gè)參數(shù)是類,第二個(gè)參數(shù)是接收類屬性數(shù)目的變量
    objc_property_t *properties = class_copyPropertyList([object class], &outCount);
    //定義一個(gè)數(shù)組來(lái)接收獲取的屬性名
    NSMutableArray *nameArray = [[NSMutableArray alloc] initWithCapacity:outCount];
    for (i = 0; i < outCount; i++) {
        //通過(guò)循環(huán)來(lái)獲取單個(gè)屬性
        objc_property_t property = properties[i];
        //取得屬性名
        NSString *propertyName = [[NSString alloc] initWithCString:property_getName(property) encoding:NSUTF8StringEncoding];
        //將得到的屬性名放入數(shù)組中
        [nameArray addObject:propertyName];
        
    }
    free(properties);
    return nameArray;
}

如果想判斷屬性的類型,只需通過(guò)valueForKey:來(lái)取得對(duì)象的屬性的值,然后判斷值的類型即可。

而如果想得一個(gè)類的成員變量該如何去做呢?
方法如下:

//獲取類的成員變量名
- (NSArray *)getVariableNamesByObject:(id)object
{
    unsigned int numIvars = 0;
    //獲取類的所有成員變量
    Ivar * ivars = class_copyIvarList([object class], &numIvars);
    //定義一個(gè)數(shù)組來(lái)接收獲取的屬性名
    NSMutableArray *nameArray = [[NSMutableArray alloc] initWithCapacity:numIvars];
    for(int i = 0; i < numIvars; i++) {
        //得到單個(gè)的成員變量
        Ivar thisIvar = ivars[i];
        //得到這個(gè)成員變量的類型
        const char *type = ivar_getTypeEncoding(thisIvar);
        NSString *stringType =  [NSString stringWithCString:type encoding:NSUTF8StringEncoding];
        //此處判斷非object-c類型時(shí)跳過(guò)
        if (![stringType hasPrefix:@"@"]) {
            continue;
        }
        //得到成員變量名
        NSString *variableName = [NSString stringWithUTF8String:ivar_getName(thisIvar)];
        [nameArray addObject:variableName];
        
        //這個(gè)函數(shù)可以得到成員變量的值
        //object_getIvar(object, thisIvar)
        
    }
    free(ivars);
    return nameArray;
}

此時(shí)我們創(chuàng)建一個(gè)Person類如圖

image

分別調(diào)用這兩個(gè)方法結(jié)果如下

image

可以發(fā)現(xiàn)成員變量變成了四個(gè),據(jù)推測(cè)可能是因?yàn)锧property進(jìn)行了處理自動(dòng)生成了成員變量進(jìn)行關(guān)聯(lián)

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

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

  • objc_property_t在實(shí)際開(kāi)發(fā)中用得還是比較多的,例如需要獲取一個(gè)注冊(cè)類的屬性,或者判斷屬性的類型,再或...
    wu2016閱讀 7,195評(píng)論 6 12
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒(méi)有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,621評(píng)論 1 32
  • 我們常常會(huì)聽(tīng)說(shuō) Objective-C 是一門(mén)動(dòng)態(tài)語(yǔ)言,那么這個(gè)「動(dòng)態(tài)」表現(xiàn)在哪呢?我想最主要的表現(xiàn)就是 Obje...
    Ethan_Struggle閱讀 2,319評(píng)論 0 7
  • 這是16年5月份編輯的一份比較雜亂適合自己觀看的學(xué)習(xí)記錄文檔,今天18年5月份再次想寫(xiě)文章,發(fā)現(xiàn)簡(jiǎn)書(shū)還為我保存起的...
    Jenaral閱讀 3,115評(píng)論 2 9
  • 說(shuō)實(shí)話我是一個(gè)很不愛(ài)讀書(shū)的人,而且經(jīng)常都是漫無(wú)目的的讀書(shū),典型的標(biāo)題黨,微信讀書(shū)書(shū)架里放了很多書(shū),都是讀到一半換另...
    開(kāi)心保娜閱讀 543評(píng)論 1 1

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