分類(Category)
分類的作用是動(dòng)態(tài)的(分類是在運(yùn)行期決議的)為一個(gè)已經(jīng)存在的類添加方法逐虚,即使你不知道這個(gè)類的源碼。
注意
1.分類中不能為類添加實(shí)例變量莉掂,如果添加實(shí)例變量會(huì)直接報(bào)錯(cuò):
Instance variables may not be placed in categories
因?yàn)樵谶\(yùn)行期,對(duì)象的內(nèi)存布局已經(jīng)確定,如果添加實(shí)例變量就會(huì)破壞類的內(nèi)部布局沪摄,這對(duì)編譯型語(yǔ)言來(lái)說(shuō)是災(zāi)難性的。
2.分類中可以使用屬性@property纱烘,但是只會(huì)生成setter杨拐、getter方法的聲明(不會(huì)生成實(shí)例變量以及setter、getter方法的實(shí)現(xiàn))擂啥。當(dāng)調(diào)用setter哄陶、getter方法時(shí),可以編譯通過(guò)哺壶,但是運(yùn)行時(shí)會(huì)報(bào)錯(cuò):
unrecognized selector sent to instance
因?yàn)閟etter屋吨、getter方法沒(méi)有實(shí)現(xiàn)蜒谤。
實(shí)現(xiàn)方法:
通過(guò)建立關(guān)聯(lián)引用的方式,實(shí)現(xiàn)setter至扰、getter方法鳍徽。
3.分類中增加的方法如果與原有類的方法重名,則分類中的方法會(huì)覆蓋原有類的方法敢课,因?yàn)榉诸惖膬?yōu)先級(jí)更高阶祭。
擴(kuò)展(Extension)
擴(kuò)展可以看作是匿名的分類。
擴(kuò)展可以為一個(gè)已經(jīng)存在的類添加方法和屬性直秆。
擴(kuò)展在編譯期決議濒募。擴(kuò)展一般用來(lái)隱藏類的私有信息,你必須有一個(gè)類的源碼才能為一個(gè)類添加擴(kuò)展圾结。
category 和 extension 的區(qū)別
- 相同點(diǎn):都可以為一個(gè)類添加方法
- 不同點(diǎn):Category只能用于添加方法瑰剃,不能用于添加成員變量。extension中聲明的方法和添加的成員變量是私有的筝野,只有主implement能調(diào)用培他,外部的類無(wú)法調(diào)用。