分類(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ǔ)言來說是災(zāi)難性的。
2.分類中可以使用屬性@property,但是只會(huì)生成setter、getter方法的聲明(不會(huì)生成實(shí)例變量以及setter、getter方法的實(shí)現(xiàn))。當(dāng)調(diào)用setter、getter方法時(shí),可以編譯通過,但是運(yùn)行時(shí)會(huì)報(bào)錯(cuò):
unrecognized selector sent to instance
因?yàn)閟etter、getter方法沒有實(shí)現(xiàn)。
實(shí)現(xiàn)方法:
通過建立關(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ò)展一般用來隱藏類的私有信息,你必須有一個(gè)類的源碼才能為一個(gè)類添加擴(kuò)展。
category 和 extension 的區(qū)別
- 相同點(diǎn):都可以為一個(gè)類添加方法
- 不同點(diǎn):Category只能用于添加方法,不能用于添加成員變量。extension中聲明的方法和添加的成員變量是私有的,只有主implement能調(diào)用,外部的類無法調(diào)用。