Categories

 Categories
catgory 允許你爲一個已經存在的類增加方法----甚至是一個你沒有source的類。
Categories是一種強大的特性,它允許你直接擴展類的功能,而不需要使用子類的方法來擴展。

需要注意的是category不可以爲要擴展的類聲明額外的實例變量;它只能包含方法。然而,所有在類的作用域裏的實例變量也在category的作用域裏。前面的實例變量指的是類裏能聲明過的實例變量,@private的也不例外。
使用categories,你可以把你自己的類的實現方法分佈在幾個不同的文件裏。 爲一個類增加categories的數量是沒有限制的,但是每一個category 的名字必須要是不相同的,而且應該聲明和定義一個不同的方法集。
How You Can Use Categories
使用categories的方式有很多:
  • 擴展一個其它實施者定義的類
     例如,你可以爲Cocoa frameworks裏的類增加方法。增加的方法會被子類繼承而且在運行時也不會和原始的方法有任何不同。
  • 作爲子類的一個替代方式
       不需要定義一個子類來擴展已有的類,通過category你可以直接爲類添加方法。例如,你可以爲NSArray和其它的Cocoa classes添加categories.與添加子類的方式來比,你不需要你擴展的類的源代碼。
  • 把實現一個新類的方法分佈在多個源文件裏
     例如,你可以把一個很大的類的方法分組到幾個categories裏,然後把每個     category放在自己的文件裏。當以這種方式使用時,categories在很多方面對開發過程都是有幫助的:
1.提供一個簡單的方式來組合相關的方法。被定義在不同的類裏的相似的方法可以被保存在同一個源文件裏。
2.當一個類是由多個開發者共同定義的時候,可以簡化大類的管理。
3.爲一個非常大的類的增量編譯提供方便。
4.提高常用方法的本地參考。
5.可以根據不同版本的程序配置不同的類,而無需爲不同版本保持相同的源代碼。
雖然Objective-C語言目前允許使用category來通過重載繼承的類的方法或者甚至是類文件中的方法,但是這種做法是被強烈反對的。category不是子類的替代品。使用category 來重載
方法有很多重大的缺陷:
  • 當category 重載一個從父類繼承過來的方法,通常可以通過super關鍵字來調用父類的實現方法。然而,如果category重載一個擴展類本身存在的方法,就沒有喚醒原始實現方法的辦法了。
  • 同一個類的category不能聲明重載這個類的另一個category中聲明的方法。這一點非常的重要,因爲很多Cocoa類也是通過使用categories來實現的。一個你試圖重載的框架中定義的方法可能本身就已經在一個category被實現了,如果你這樣做了,很可能使用得前面的category的方法的實現失效。
  • 一些category methods的存在可能會導致整個框架的行爲發生變化。
     例如,如果你在NSObject的一個category中重載windowWillClose:委託方法,在你的程序裏所有窗口的委託將會使用category方法來回應;所有NSWIndow實例的行爲都會改變。你爲一個框架類增加的Categories可能會導致行爲上很神祕的變化和程序的崩潰。
Categories of the Root Class
Category 可以爲任何的類添加方法,其中也包括root class。添加到NSObject類上的方法對於所有與你的代碼相關聯的類都是可用的。有時候爲root class添加方法是非常有用的,但是它也是非常危險的。雖然從表面上看起來category所做出的修改可以被很好的理解,而且影響也是有限的,但是繼承的機制使得它有了一個廣泛的作用域。你可能會對你程序裏不可見的類做出意想不到的修改;你可能會對你正在做的事會產生的結果一無所知。甚者,當對你修改過什麼一無所知的人在你的程序上工作時,他們對於他們正在做的事也不會有一個充分的瞭解。
另外,當你爲root class實現方法時有兩點需要記住:
  • 發送消息給super是非法的(因爲NSObject沒有超類)
  • 類的對象可以執行root class中定義的實例方法
正常來說,類對象只能執行類方法。但是root class中定義的實例方法是一個特例。它們定義了一個類,在運行時系統中的所有對象都繼承這個類。類對象是完全成熟的對象,它需要共享同一個類。

這個特性意味着你爲NSObject類在category定義的實例方法不僅要能被實例對象執行,而且也要能被類對象執行。例如:在方法體中,self可能代表一個類對象,也可能是類的一個實例。



 
 
   

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