淺談Categroy不能為原類添加Property的原因

在日常的開發(fā)當(dāng)中我們經(jīng)常使用Category來處理一些問題,但是Category有個蛋疼的事,不能為原類添加屬性。了解過Runtime的小伙伴都知道,我們可以利用runtime來解決這個問題。但是今天我們來了解一下Category為什么不能為原類添加屬性。

我們先來創(chuàng)建一個Book類,定義一個屬性BookName。

@interface Book : NSObject

@property (nonatomic, copy) NSString *bookName;

@end

再來創(chuàng)建一個分類,定義一個屬性。

@interface Book (Property)

@property (nonatomic, copy) NSString *author;

@end

這里大家要先了解一下屬性的構(gòu)成

Property(屬性) = ivar(實(shí)例變量) + setter + getter

接下來我們可以利用runtime來打印一下。

//獲取類的成員變量
- (void)getClassIvars {
    
    unsigned int count;
    
    //獲取成員變量的數(shù)組的指針
    Ivar *ivars = class_copyIvarList([Book class], &count);
    
    for (int i = 0; i < count; i++) {
        Ivar ivar = ivars[i];
        
        //根據(jù)ivar獲得其成員變量的名稱
        const char *name = ivar_getName(ivar);
        //c的字符串轉(zhuǎn)oc的字符串
        NSString *key = [NSString stringWithUTF8String:name];
        NSLog(@"ivar__%d == %@",i,key);
    }
    //記得釋放
    free(ivars);
    //如果你的成員私有,也可以獲取到 比如_education
}
//獲取類的成員屬性
- (void)getClassProperty {
    unsigned int count;
    
    //獲得指向該類所有屬性的指針
    objc_property_t *properties = class_copyPropertyList([Book class], &count);
    
    for (int i = 0; i < count; i++) {
        //獲取該類的一個屬性的指針
        objc_property_t property = properties[i];
        //獲取屬性的名稱
        const char *name = property_getName(property);
        //將c的字符串轉(zhuǎn)化為OC字符串
        NSString *key = [NSString stringWithUTF8String:name];
        
        NSLog(@"propertyLabel__%d == %@",i,key);
    }
    //記得釋放
    free(properties);
    
}

打印結(jié)果

2017-02-22 14:57:21.218 DDTool[1757:134117] ivar__0 == _bookName
2017-02-22 14:57:21.219 DDTool[1757:134117] property__0 == author
2017-02-22 14:57:21.219 DDTool[1757:134117] property__1 == bookName
2017-02-22 14:57:21.219 DDTool[1757:134117] method__0 == bookName 2
2017-02-22 14:57:21.219 DDTool[1757:134117] method__1 == setBookName: 3
2017-02-22 14:57:21.219 DDTool[1757:134117] method__2 == .cxx_destruct 2
  • 這里我們可能有一個疑惑,pro_list打印的結(jié)果中不是有author這個屬性么(這個下面會說,我們先觀察重點(diǎn)),我們發(fā)現(xiàn)ivar_list打印的結(jié)果中只有_bookName這個實(shí)例變量,沒有_author。這樣我們就可以大概知道為什么添加不了屬性了,沒有滿足屬性的構(gòu)成條件。
  • 接著上面的疑問來講,其實(shí)這里打印的pro_list并非是上文所述的屬性,它只是一個屬性的描述。這里看到其他的博客上有講到:

每次在增加一個屬性,系統(tǒng)都會在ivar_list中添加一個成員變量的描述,在method_list中增加setter與getter方法的描述,在pro_list中增加一個屬性的描述,然后計算該屬性在對象中的偏移量,然后給出setter與getter方法對應(yīng)的實(shí)現(xiàn)。

至于Category為什么沒有生成ivar,是因?yàn)榉诸惐旧聿⒉皇且粋€真正的類,它并沒有自己的isa。

以上是自己在查閱資料后的一些淺層理解,不正確的、不足的地方還有望指出。??

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

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

  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 2,032評論 0 9
  • 對于從事 iOS 開發(fā)人員來說,所有的人都會答出【runtime 是運(yùn)行時】什么情況下用runtime?大部分人能...
    夢夜繁星閱讀 3,799評論 7 64
  • 作為《舌尖上的中國》的總導(dǎo)演,陳曉卿顯然是這個節(jié)目的核心人物,能夠如此恰到好處的把握全國億萬人民的味蕾,讓大家都看...
    陳妮弗勞倫斯閱讀 678評論 0 2
  • 〈一〉 今天和一個 認(rèn)識了十七年的同學(xué)聚會 上一次的見面已經(jīng)是在一年前的這個時候 當(dāng)年讀書時候 每天見面 而后 每...
    CCCHOIWIN閱讀 309評論 0 0
  • 當(dāng)人們走進(jìn)一家不熟悉的飯店吃飯,面對菜單上琳瑯滿目的菜品,總是很困惑。 這時你通常會問服務(wù)員,店里的招牌菜是什么。...
    Jake先森閱讀 871評論 7 13

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