類別(Category)和類拓展(Extension)是Objective-C中獨有的用于拓展類對象的機制瓮下。
類別(Category)在不改變原來代碼的情況下,向一個已經(jīng)存在的類中添加新的方法该编,只需要知道這個類的公開接口,不需要源碼。類別添加的新方法有更高的優(yōu)先級芍瑞,會覆蓋類中同名的已有方法。類別只能為已存在的類添加新的方法增拥,不能添加新的屬性(注1)啄巧。
類別相對于繼承
繼承更加自由,可以添加新屬性和新方法掌栅。類別的優(yōu)點是不需要新創(chuàng)建一個類秩仆,而是正系統(tǒng)已有的類上直接拓展和改寫,不需要更改類就能添加并使用拓展方法猾封。另一個優(yōu)點是類別可以實現(xiàn)拓展模塊的隔離澄耍,只有在引用本類時才能看到拓展的方法。
類別相對于類拓展
類拓展可以添加屬性晌缘,在類拓展中添加的方法必須實現(xiàn)齐莲。類拓展可以看作一個私有的匿名類別。類拓展的定義在.m文件頭部磷箕,添加的屬性和方法都沒有暴露在.h頭文件选酗,通常情況下只能在類內(nèi)部使用,一定程度上實現(xiàn)了私有機制岳枷。
類別的作用和局限性
1芒填、可以將類的實現(xiàn)分散到多個文件或者多個框架中
2、可以創(chuàng)建對私有方法的前向引用(注2)
3空繁、可以向?qū)ο筇砑臃钦絽f(xié)議
4殿衰、類別只能向原類中添加新的方法,不能修改或者刪除盛泡,也不能添加新的屬性
5闷祥、類別添加的新方法全局有效且優(yōu)先級最高,與原方法重名會進行覆蓋傲诵。
類拓展(Extension)常用于在.m文件的頭部進行頭文件私有屬性變量補充凯砍,將不想暴露給外部的一些變量定義在類拓展中。
注1:向類別中添加屬性會失敗掰吕,從設(shè)計上考慮可以認(rèn)為是為了保持類別的單純特性果覆,和繼承區(qū)別開,防止類別污染被拓展的類殖熟。根本原因是無法在類別中獲取屬性加下劃線的實例變量名局待,導(dǎo)致無法手動實現(xiàn)存取方法。在類別中定義屬性后能在類的屬性列表中找到,但編譯器只聲明了存取方法钳榨,沒有實現(xiàn)舰罚。對于一個不能訪問的屬性,相當(dāng)于不存在薛耻。利用運行時的機制营罢,開發(fā)者可以強行實現(xiàn)類別中屬性的存取方法,實現(xiàn)在類別中拓展屬性饼齿。
注2:Cocoa沒有任何真正的私有方法饲漾。只要知道對象支持的某個方法的名稱,即使該對象所在的類沒有該方法的聲明缕溉,也可以通過新建一個該類的類別考传,在.h文件中聲明,就可以進行調(diào)用证鸥。這就是私有方法的前向引用僚楞。