想必大家都知道在分類中能擴(kuò)展屬性,而對(duì)于能不能擴(kuò)展屬性,能不能擴(kuò)展成員變量是不是有點(diǎn)模糊,今天元宵節(jié),我就清清嗓子說上兩句吧
(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)沖~_~ !!)。
先說說屬性,屬性是對(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)了
看到這里你也許就會(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 *` */分類中可以給一個(gè)對(duì)象(類也是對(duì)象)添加屬性,但是不能添加成員變量,只能關(guān)聯(lián)上去。 注意:如果不信,你可以自己再打印一遍吧,會(huì)發(fā)現(xiàn)只能打印出添加的屬性,打印不出變量。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注