分類可以添加屬性,不能添加成員變量

分類中是可以為一個類添加屬性的鹦蠕,但是一定做不到添加成員變量误阻,不要混淆了成員變量和屬性的概念.只是說現(xiàn)在Xcode自動會給屬性生成成員變量讓大家對這個概念有點(diǎn)混淆阻荒。Property是Property崔涂,Ivar是Ivar罗珍。分類里面不能添加Ivar是因?yàn)榉诸惐旧聿⒉皇且粋€真正的類,它并沒有自己的ISA .借用一位博主的話: "類最開始生成了很多基本屬性鹏往,比如IvarList淡诗,MethodList,分類只會將自己的method attach到主類,并不會影響到主類的IvarList韩容。這就是為什么分類里面不能增加成員變量的原因"

iOS分類中不能只是通過@property添加屬性款违。這里探討一下不能添加的原因和添加的方法

首先,創(chuàng)建一個person類群凶,代碼如下:

XGPerson.h

#import@interfaceXGPerson:NSObject/// 年齡@property(nonatomic,copy)NSString*age;/// 性別@property(nonatomic,copy)NSString*sex;- (void)text1;@end

XGPerson.m

#import"XGPerson.h"@implementationXGPerson- (void)text1 {NSLog(@"%s",__func__);}- (void)text2 {NSLog(@"%s",__func__);}@end

在控制器里獲取并打印該類的成員變量插爹、屬性和方法,代碼如下:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent*)event {// 獲取成員變量unsignedintivarCount =0;? ? Ivar *ivars = class_copyIvarList([XGPersonclass], &ivarCount);for(inti =0; i < ivarCount; i++) {? ? ? ? Ivar ivar = ivars[i];NSLog(@"第%d個成員變量:%s",i,ivar_getName(ivar));? ? }? ? free(ivars);// 獲取屬性unsignedintpropertyCount =0;? ? objc_property_t *propertyList = class_copyPropertyList([XGPersonclass], &propertyCount);for(inti =0; i < propertyCount; i++) {? ? ? ? objc_property_t property = propertyList[i];NSLog(@"第%d個屬性:%s",i,property_getName(property));? ? }// 獲取方法列表unsignedintmethodCount =0;? ? Method *methods = class_copyMethodList([XGPersonclass], &methodCount);for(inti =0; i < methodCount; i++) {? ? ? ? Method method = methods[i];NSLog(@"第%d個方法:%s",i, sel_getName(method_getName(method)));? ? }}

此時控制臺輸出如下:

沒有分類時.png

這里需要提出的是请梢,平時使用@property的時候赠尾,系統(tǒng)會自動生成帶“_”的成員變量和該變量的setter和getter方法。也就是說毅弧,屬性相當(dāng)于一個成員變量加getter和setter方法气嫁。那么,在分類里使用@property會是什么樣子呢够坐,下面來創(chuàng)建一個分類:

XGPerson+height.h

#import"XGPerson.h"@interfaceXGPerson(height)@property(nonatomic,copy)NSString*height;@end

XGPerson+height.m

#import"XGPerson+height.h"#import@implementationXGPerson(height)@end

如果像上面一樣只在.h文件里聲明height寸宵,那么.m文件里會出現(xiàn)兩個警告,意思是說沒有實(shí)現(xiàn)setter和getter方法元咙。

警告.png

此時在控制器里執(zhí)行touchesBegan方法邓馒,控制臺輸出如下:

有分類未實(shí)現(xiàn)存取方法.png

可以看到,此時person類里并沒有添加帶“_”的成員變量蛾坯,也沒有實(shí)現(xiàn)setter和getter方法,只是在屬性列表里添加了height屬性疏遏。并且此時如果在控制器里調(diào)用self.height脉课,程序運(yùn)行時會報(bào)錯,顯示找不到該方法财异。實(shí)現(xiàn)一下person分類里的兩個方法:

XGPerson+height.m

#import"XGPerson+height.h"#import@implementationXGPerson(height)- (NSString*)height { } - (void)setHeight:(NSString*)height { }@end

此時在控制器里執(zhí)行touchesBegan方法倘零,控制臺輸出如下:

有分類實(shí)現(xiàn)存取方法.png

可以看到即使實(shí)現(xiàn)了setter和getter方法,也仍然沒有添加帶“”的成員變量戳寸,也就是說呈驶,在setter和getter方法里仍然不能直接訪問以下劃線開頭的成員變量,因?yàn)樵诜诸惱镉聾property聲明屬性時系統(tǒng)并沒有添加以“”開頭的成員變量疫鹊。此時要達(dá)到添加的目的可以使用運(yùn)行時的關(guān)聯(lián)對象袖瞻。示例代碼如下:

XGPerson+height.m

#import"XGPerson+height.h"#import@implementationXGPerson(height)- (NSString*)height {returnobjc_getAssociatedObject(self,@"height"); } - (void)setHeight:(NSString*)height { objc_setAssociatedObject(self,@"height", height, OBJC_ASSOCIATION_COPY_NONATOMIC); }@end

當(dāng)然也可以在setter和getter方法里訪問該類其他的屬性,比如在UIView的分類的里添加x拆吆、y屬性聋迎,可以直接返回self.frame.origin.x和self.frame.origin.y。

總結(jié)

在分類里使用@property聲明屬性枣耀,只是將該屬性添加到該類的屬性列表霉晕,并聲明了setter和getter方法,但是沒有生成相應(yīng)的成員變量,也沒有實(shí)現(xiàn)setter和getter方法牺堰。所以說分類不能添加屬性拄轻。但是在分類里使用@property聲明屬性后,又實(shí)現(xiàn)了setter和getter方法伟葫,那么在這個類以外可以正常通過點(diǎn)語法給該屬性賦值和取值恨搓。就是說,在分類里使用@property聲明屬性扒俯,又實(shí)現(xiàn)了setter和getter方法后奶卓,可以認(rèn)為給這個類添加上了屬性。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末撼玄,一起剝皮案震驚了整個濱河市夺姑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌掌猛,老刑警劉巖盏浙,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異荔茬,居然都是意外死亡废膘,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進(jìn)店門慕蔚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來丐黄,“玉大人,你說我怎么就攤上這事孔飒」喙耄” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵坏瞄,是天一觀的道長桂对。 經(jīng)常有香客問我,道長鸠匀,這世上最難降的妖魔是什么蕉斜? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮缀棍,結(jié)果婚禮上宅此,老公的妹妹穿的比我還像新娘。我一直安慰自己爬范,他們只是感情好诽凌,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著坦敌,像睡著了一般侣诵。 火紅的嫁衣襯著肌膚如雪痢法。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天杜顺,我揣著相機(jī)與錄音财搁,去河邊找鬼。 笑死躬络,一個胖子當(dāng)著我的面吹牛尖奔,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播穷当,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼提茁,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了馁菜?” 一聲冷哼從身側(cè)響起茴扁,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎汪疮,沒想到半個月后峭火,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡智嚷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年卖丸,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盏道。...
    茶點(diǎn)故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡稍浆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出猜嘱,到底是詐尸還是另有隱情粹湃,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布泉坐,位于F島的核電站,受9級特大地震影響裳仆,放射性物質(zhì)發(fā)生泄漏腕让。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一歧斟、第九天 我趴在偏房一處隱蔽的房頂上張望纯丸。 院中可真熱鬧,春花似錦静袖、人聲如沸觉鼻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽坠陈。三九已至萨惑,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間仇矾,已是汗流浹背庸蔼。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留贮匕,地道東北人姐仅。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像刻盐,于是被迫代替她去往敵國和親掏膏。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評論 2 355

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

  • 前言 相信大家對這兩個詞都不陌生敦锌,但是大家會很容易將這兩個詞混淆馒疹,所以在探究之前,先來說下什么是成員變量供屉,什么是屬...
    百客閱讀 8,911評論 2 18
  • 出題者簡介: 孫源(sunnyxx)行冰,目前就職于百度,負(fù)責(zé)百度知道 iOS 客戶端的開發(fā)工作伶丐,對技術(shù)喜歡刨根問底和...
    戈多_于勒閱讀 1,798評論 0 5
  • 張開你的眼睛 判斷是非對錯 人情冷暖 盲目聽信只會讓你錯過真心對你的人 至今 我仍拿出五分的真心對你 我仍愿意在...
    章北安閱讀 214評論 0 0
  • 第一篇悼做!歡迎鼓勵! 姑娘最近參與了一項(xiàng)幾百人的大型團(tuán)體操(運(yùn)動會的開幕式)哗魂,用老師的話來說:“這就是玩人堆肛走,走...
    開闊呢閱讀 134評論 1 0
  • 離開許久 你的痕跡還在 將你想得很好很好 這樣好過些 或?qū)⒛阆氲煤軌暮軌?這樣也好過 萬萬不能剛剛好 這般 讓我如何過
    MelissaJiang閱讀 190評論 0 2