iOS的category和protocol

        不少時候咱們須要擴展一下現有的類,增長一點功能。若是有源碼,修改一下便可,若是是第三方的庫,就要麻煩一些。在C++中咱們使用類繼承的方法來實現,在ObjectiveC中固然也能夠這麼作,不過ObjectiveC還提供的一種簡單實用的方法,就是category,對於一些很微小的功能增長,或者就是增長一個方法方便使用,用category是最輕量級的。框架

      xCode中已經提供了增長category的引導,好比咱們想增長如下UILabel的內容豎直對齊的方法,那麼就須要以下進行必定的設置:spa


      生成的文件名字是UILabel+VAlign.h/m,雖然不是必須是這樣的,但每每約定俗成是類名+類別名。設計

      生成的代碼以下:code

@implementation UILabel (VAlign)

@end
      咱們能夠看見,這個和類的實現是很類似的,只是多了一個(VAlign),這個就說明這是UILabel類的一個名稱是VAlign的類別。咱們能夠在類別裏面添加方法,可是不能添加成員變量。這裏又有一個特殊的地方,不能添加成員變量,顯然就不能添加屬性了,但咱們能夠用@dynamic關鍵字來添加屬性(仍是不能直接添加成員變量)。

      Category的方便性仍是顯而易見的,在開發過程當中,經常會遇到須要對類進行修改,增長一些方法的情形。這樣經過category機制,咱們能夠很簡潔的實現這樣的需求,同時也減輕了類的設計的難度。orm

      但Category也有它自身的缺點,一是沒法添加新的成員變量,二是因爲代碼可能很分散,容易出現方法的重名。當方法出現重名時,類別的優先級是高於類自己的,就是說,若是類有一個foo()的方法,category也有一個foo()的方法,則咱們使用foo()方法時,調用的時category的foo()方法。對象


      有一種特別的category,叫作class extension,它能夠增長成員變量!它的語法格式就是無名的categoryblog

@implementation UILabel ()

@end
      你能夠增長多個class extension,但若是使用過濫,也容易帶來Bug。

      Category主要用途有3個:將類的實現代碼分散到多個不一樣的文件和框架中,建立對死之後方法的前向引用,向對象添加非正式協議(informal protocol)。繼承

      

      Category是非正式協議,那麼iOS中確定存在正式協議了(Protocol),正式的協議不像category同樣鬆散,它是一系列方法的集合,分紅強制和非強制兩部分,當你要實現一個協議時,你須要實現全部強制方法,非強制方法能夠根據實際狀況來實現。 能夠被繼承。protocol能夠繼承,使用時是在類聲明時用<>說明,常見的NSCopying、UITableViewDataSource、UITableViewDelegate等等。ip

相關文章
相關標籤/搜索