面試題:分類和擴(kuò)展的區(qū)別

分類(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)用。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 今天在研究swift的時(shí)候看到了分類和擴(kuò)展。這是兩個(gè)十分重要有用的功能,但是之前用的不多,沒有深入了解過,在今天就...
    weicyNO_1閱讀 2,944評(píng)論 1 3
  • *面試心聲:其實(shí)這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個(gè)offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,210評(píng)論 30 471
  • 目錄 丫頭和別人最不一樣的地方,就是她晚上特能睡,早上特早醒。所以,第二天一大早,我的兩個(gè)酒窩又一次慘遭蹂躪。 “...
    lekli閱讀 499評(píng)論 0 1
  • 1.這個(gè)世界充滿著驚喜與驚嚇! 2.信息是致富的關(guān)鍵。 3.紙上得來終覺淺,絕知此事要躬行。
    Eric小風(fēng)閱讀 153評(píng)論 0 0
  • 時(shí)文 女兒對(duì)色彩的敏感,得益于她從小學(xué)畫畫。她上中班的時(shí)候,我就送她去少年宮跟一位美術(shù)老師學(xué)畫畫。一天她學(xué)畫回來,...
    時(shí)間yi閱讀 699評(píng)論 1 4