二、Runtime概念部分 之 Property

本文github地址 https://github.com/ICZhuang/Runtime 朋友們?nèi)绻矚g收藏即可穆壕,不建議轉(zhuǎn)載洛退,筆者會不定期update文章干奢,github 也會同步更新饺鹃,喜歡就star一下吧彼水。

Property


從代碼中看汗侵,它就是一個帶著property attribute和自帶訪問器的Ivar幸缕,類似于Ivar,Property 在Runtime中的表示則為 objc_property_t晰韵,它是一個 objc_property 結(jié)構(gòu)體的指針(筆者沒找到它的定義发乔,后續(xù)找到后補(bǔ)上,不過各位看官可以類比Ivar的訪問方法雪猪,可以猜測 objc_property 可能長什么樣)栏尚。

諸如 nonatomic/readonly/assign/strong/weak 等這些則為property attribute。(兩個單詞皆有屬性的意思只恨,如果寫成 屬性的屬性 不免拗口译仗,在這直接寫上英文原文,下面將它們述為 attribute官觅。)

那么屬性(property)帶有的信息 有attributes纵菌、type、name休涤,當(dāng)然同時還有setter或者getter咱圆。

獲取屬性


同樣,通過class_copyPropertyList可獲取類中的屬性列表

objc_property_t *class_copyPropertyList(Class cls, unsigned int *outCount);

或者直接通過屬性名獲得對應(yīng)的屬性

objc_property_t class_getProperty(Class cls, const char *name);

訪問屬性

對于屬性的結(jié)構(gòu)體objc_property_t功氨,同樣有對應(yīng)的相關(guān)字段(或者成為信息)的操作方法

1序苏、獲取name

const char *property_getName(objc_property_t property);

2、取屬性的type encoding

const char *property_getAttributes(objc_property_t property);

3捷凄、上面方法是把 attributes 以字符串返回杠览,通過下面方法可以取得 attribute 列表,進(jìn)而通過遍歷可以取得每個attribute的信息

objc_property_attribute_t *property_copyAttributeList(objc_property_t property, unsigned int *outCount);

這里涉及到另一個結(jié)構(gòu)體objc_property_attribute_t纵势,每個 attribute 通過結(jié)構(gòu)體 objc_property_attribute_t 定義

typedef struct {
    const char *name;           /**< The name of the attribute */
    const char *value;          /**< The value of the attribute (usually empty) */
} objc_property_attribute_t;

4踱阿、通過指定一個attribute的name管钳,獲得對應(yīng)的value

char *property_copyAttributeValue(objc_property_t property, const char *attributeName);

相當(dāng)于獲得一個attribute,然后直接按結(jié)構(gòu)體訪問方法訪問它的字段值

遍歷


- (void)getProperties {
    /// get properties 
    unsigned int count = 0;
    objc_property_t *properties = class_copyPropertyList(RTModel.class, &count);
    
    objc_property_t property;
    for (int index = 0; index < count; ++index) {
        property = properties[index];
        
        printf("%s - %s\n", property_getName(property), property_getAttributes(property));
        /// get attribute's name and it's value
        unsigned int out_count = 0;
        objc_property_attribute_t *list = property_copyAttributeList(property,&out_count);
        
        objc_property_attribute_t attribute;
        for (int i = 0; i < out_count; ++i) {
            attribute = list[i];
            
            printf("%s - %s\n", attribute.name, attribute.value);
        }
    }
}

Type Encoding


屬性的type encoding软舌,除了變量類型的才漆,還應(yīng)帶上各個attribute的編碼,可以說屬性的類型是由這兩者組成佛点。比如RTModel的屬性的type encodings如下

image-01
image-01

關(guān)于property attribute的編碼詳細(xì)可參閱Objective-C Runtime Programming Guide > Declared Properties

另外通過property_02的獲得attributes列表醇滥, attribute.name 和 attribute.value打印如下。如‘T’就是attribute的name字段超营,對應(yīng)的value是‘NSArray’

image-02
image-02
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鸳玩,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子演闭,更是在濱河造成了極大的恐慌不跟,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件米碰,死亡現(xiàn)場離奇詭異窝革,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)吕座,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進(jìn)店門虐译,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人吴趴,你說我怎么就攤上這事漆诽。” “怎么了锣枝?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵拴泌,是天一觀的道長。 經(jīng)常有香客問我惊橱,道長蚪腐,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任税朴,我火速辦了婚禮回季,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘正林。我一直安慰自己泡一,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布觅廓。 她就那樣靜靜地躺著鼻忠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪杈绸。 梳的紋絲不亂的頭發(fā)上帖蔓,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天矮瘟,我揣著相機(jī)與錄音,去河邊找鬼塑娇。 笑死澈侠,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的埋酬。 我是一名探鬼主播哨啃,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼写妥!你這毒婦竟也來了拳球?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤珍特,失蹤者是張志新(化名)和其女友劉穎祝峻,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體次坡,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年画畅,在試婚紗的時候發(fā)現(xiàn)自己被綠了砸琅。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡轴踱,死狀恐怖症脂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情淫僻,我是刑警寧澤诱篷,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站雳灵,受9級特大地震影響棕所,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜悯辙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一琳省、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧躲撰,春花似錦针贬、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至谆棱,卻和暖如春快压,著一層夾襖步出監(jiān)牢的瞬間圆仔,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工嗓节, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留荧缘,地道東北人。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓拦宣,卻偏偏與公主長得像截粗,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子鸵隧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評論 2 353

推薦閱讀更多精彩內(nèi)容