Categories in Objective-C

 本文轉自Categories in Objective-C

Category,中文翻譯爲分類,是Objective-C中不同於C/C++一中語法。Category可以爲已存在的類添加方法,即使你沒有這個類的源碼,聽上去很誘人吧?

Category可以做什麼?

  • Category提供了除子類化外,擴展類功能的另一途徑。
  • 使用Category,可以將類功能按照邏輯關係分散實現,便於組織。
  • Category雖然不能夠添加成員變量,但是類的成員變量對於Category實現的方法卻是可見的,即使是@private變量,這個太狠了。
  • 在運行階段,Category擴展的方法與類原有方法無異,子類同樣可以享有這些繼承。
  • 將類的實現分散到多個文件中,可以將一個超級大的類按邏輯分組,分別用不同Category實現。好處多多:
    • 提供簡單的組合相關方法的途徑。
    • 多人開發同一類時可以簡化類的管理。
    • 對於編譯器,這樣也許在增量編譯上能夠節省不少時間。
    • 能夠幫助改進常用方法的本地化,這點得益於Category可以重載類中現有方法。
    • 不需要維護同一份代碼的多個版本即可爲不同的程序定製類。
    • 聲明非正式協議。

注意事項:

  • 不能夠使用Category來爲現有類添加成員變量,如果想這麼做,請子類化現有類。
  • Category爲現有類提供的方法將成爲現有類的一部分,無論使用者想不想要;而子類化現有類提供的方法只會成爲子類的一部分,並沒有改變現有類。從這點來說,Category比子類化更狠,直接改變了類聲明和定義。
  • Category沒有數量限制,但是Category及其聲明的方法必須保證唯一性,這個很好理解,因爲對於調用者來說,不希望看到一個類有重複聲明和定義的方法吧?
  • 雖然Category可以重載現有類的方法,但是不建議這麼做。Category不是子類化的替身。使用Category來重載方法缺點多多:
    • 我們在子類中重載實現父類方法時,通常需要在實現中調用super的方法。然而,如果Category重載了父類的方法,那麼將再也無法調用原有方法了。
    • Category重載其他Category中聲明的方法是不可靠的。這點非常重要,很多Cocoa類都是利用Category實現的。你想通過Category重載的方法也許就是其他Category實現的,而究竟哪個Category的重載優先級高並沒有被定義,一旦出現,死都不知道怎麼死的……
    • 某些Category重載的方法可能會導致整個frameworks的行爲改變。例如,如果你重載windowWillClose方法,那麼你程序中所有窗口行爲也許會發生變化。這一點有點經驗的程序員一般都能控制好。
    • 爲根類(如NSObject)添加方法有時候很有用,但也是非常危險的。雖然看上去Category導致的改動是可控的,然而繼承會讓你失去控制。也許你的改變對那些你看不到的類會造成意想不到的改變。

Category是把雙刃劍,慎用!

 

發佈了31 篇原創文章 · 獲贊 2 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章