国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 系統(tǒng) > iOS > 正文

iOS中為什么非要用runtime才能在分類中擴(kuò)展屬性呢

2019-11-07 23:11:54
字體:
供稿:網(wǎng)友

想必大家都知道在分類中能擴(kuò)展屬性,而對(duì)于能不能擴(kuò)展屬性,能不能擴(kuò)展成員變量是不是有點(diǎn)模糊,今天元宵節(jié),我就清清嗓子說上兩句吧

論點(diǎn)

(1)分類中是能擴(kuò)展屬性的 (2)分類是不能給一個(gè)類擴(kuò)展成員變量的

先嘮嘮嗑

強(qiáng)調(diào)一下,分類不是類,它只是對(duì)類的一個(gè)擴(kuò)展,沒有ISA指針,我們知道我們可以通過runtime在不影響原來模塊的情況下給模塊擴(kuò)展方法,有沒有感覺這一句話好像也可以描述分類,所以你可以認(rèn)為分類是實(shí)現(xiàn)這一功能的捷徑,不然你覺得是用分類擴(kuò)展方法容易還是用runtime來實(shí)現(xiàn)容易啊(正值年輕,說話有點(diǎn)沖~_~ !!)。

論據(jù)

先說說屬性,屬性是對(duì)成員變量的一個(gè)封裝,當(dāng)我們聲明一個(gè)屬性的時(shí)候,Xcode會(huì)給我們默認(rèn)創(chuàng)建一個(gè) _屬性名 的成員變量,也會(huì)給我們自動(dòng)創(chuàng)建getter和setter方法。當(dāng)然我們也可以用@synthesize指定其關(guān)聯(lián)的變量 例如給屬性name指定其關(guān)聯(lián)的變量@synthesize name = xxx;self.name其實(shí)是操作的實(shí)例變量xxx,而不是_name了。 窩草,扯遠(yuǎn)了,回歸正傳。。 所以我們要添加一個(gè)屬性得有三樣?xùn)|西,setter、getter以及關(guān)聯(lián)的成員變量。 在分類中Xcode不會(huì)為我們自動(dòng)創(chuàng)建setter、getter方法,但是我們可以手動(dòng)實(shí)現(xiàn),但是如何把一個(gè)變量關(guān)聯(lián)到屬性上呢,直接聲明一個(gè)全局變量不行嗎,事實(shí)證明不太行,對(duì)于getter方法還好說,直接返回一個(gè)變量就行,可是setter方法卻不行,因?yàn)槟阋业皆搶傩躁P(guān)聯(lián)的變量你才能給人家賦值啊,怎么辦?怎么辦??這只能用runtime的對(duì)象關(guān)聯(lián)來實(shí)現(xiàn)了

.m文件中// 定義關(guān)聯(lián)的keystatic const char *key = "name";@implementation NSObject (PRoperty)- (NSString *)name{ // 根據(jù)關(guān)聯(lián)的key,獲取關(guān)聯(lián)的值。 return objc_getAssociatedObject(self, key);}- (void)setName:(NSString *)name{ // 參數(shù)一:目標(biāo)對(duì)象 // 參數(shù)二:關(guān)聯(lián)的key,可以通過這個(gè)key獲取 // 參數(shù)三:關(guān)聯(lián)的value // 參數(shù)四:關(guān)聯(lián)的策略 objc_setAssociatedObject(self, key, name, OBJC_ASSOCIATION_RETAIN_NONATOMIC);}@end

看到這里你也許就會(huì)說,這TMD不是把變量給添加上去了嗎?我表示默默一笑,如果你打印IVarList你就會(huì)發(fā)現(xiàn)并沒有這個(gè)變量,只能打印出添加的屬性。 其實(shí)對(duì)象關(guān)聯(lián)只是關(guān)聯(lián)上去了,并沒有把變量添加進(jìn)去,說了這么多這回你該信了吧。 原因就是分類不是類,他沒有ISA指針,下面是ISA指針,可以看出他本質(zhì)上是一個(gè)結(jié)構(gòu)體(只是換了個(gè)馬甲被稱之為Class類型,怕你迷糊,再說明白一點(diǎn),ISA指針就是Class類型),通過ISA指針才能找指向變量的ivars,也就是說你都不知道變量的家,你怎么去給它生猴子啊,但是奇怪了,ISA指針里沒有指向?qū)傩詳?shù)組的指針,沒有是對(duì)的,要不然這一段的解釋就廢了,可是講真,屬性指針在哪啊???有知道的小伙伴請(qǐng)告訴我一下 >_< !!!

struct objc_class { Class isa OBJC_ISA_AVAILABILITY;#if !__OBJC2__ Class super_class OBJC2_UNAVAILABLE; const char *name OBJC2_UNAVAILABLE; long version OBJC2_UNAVAILABLE; long info OBJC2_UNAVAILABLE; long instance_size OBJC2_UNAVAILABLE; struct objc_ivar_list *ivars OBJC2_UNAVAILABLE; struct objc_method_list **methodLists OBJC2_UNAVAILABLE; struct objc_cache *cache OBJC2_UNAVAILABLE; struct objc_protocol_list *protocols OBJC2_UNAVAILABLE;#endif} OBJC2_UNAVAILABLE;/* Use `Class` instead of `struct objc_class *` */
結(jié)論

分類中可以給一個(gè)對(duì)象(類也是對(duì)象)添加屬性,但是不能添加成員變量,只能關(guān)聯(lián)上去。 注意:如果不信,你可以自己再打印一遍吧,會(huì)發(fā)現(xiàn)只能打印出添加的屬性,打印不出變量。


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 巫溪县| 德清县| 郎溪县| 景东| 营口市| 五华县| 清苑县| 泉州市| 蒙山县| 莱芜市| 石屏县| 应用必备| 绩溪县| 宁夏| 平和县| 枣阳市| 锡林浩特市| 称多县| 林甸县| 酒泉市| 长岭县| 武功县| 平邑县| 喀什市| 扎鲁特旗| 车致| 徐州市| 蕉岭县| 普兰县| 舟曲县| 永清县| 辽宁省| 长宁区| 灵宝市| 洪江市| 客服| 上饶县| 青海省| 西盟| 深泽县| 瑞金市|