你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> iOS的category和protocol

iOS的category和protocol

編輯:IOS開發綜合

很多時候我們需要擴展一下現有的類,增加一點功能。如果有源碼,修改一下即可,如果是第三方的庫,就要麻煩一些。在C++中我們使用類繼承的方法來實現,在ObjectiveC中當然也可以這麼做,不過ObjectiveC還提供的一種簡單實用的方法,就是category,對於一些很微小的功能增加,或者就是增加一個方法方便使用,用category是最輕量級的。

xCode中已經提供了增加category的引導,比如我們想增加以下UILabel的內容豎直對齊的方法,那麼就需要如下進行一定的設置:

\

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

生成的代碼如下:

@implementation UILabel (VAlign)

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

Category的方便性還是顯而易見的,在開發過程中,常常會遇到需要對類進行修改,增加一些方法的情形。這樣通過category機制,我們可以很簡潔的實現這樣的需求,同時也減輕了類的設計的難度。

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


有一種特別的category,叫做class extension,它可以增加成員變量!它的語法格式就是無名的category

@implementation UILabel ()

@end
你可以增加多個class extension,但如果使用過濫,也容易帶來Bug。

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

Category是非正式協議,那麼iOS中肯定存在正式協議了(Protocol),正式的協議不像category一樣松散,它是一系列方法的集合,分成強制和非強制兩部分,當你要實現一個協議時,你需要實現所有強制方法,非強制方法可以根據實際情況來實現。 可以被繼承。protocol可以繼承,使用時是在類聲明時用<>說明,常見的NSCopying、UITableViewDataSource、UITableViewDelegate等等。

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved