objective-c中提供了可以讓我們擴充套件類定義的手段:類目,延展和協議。類目:為已知的類增加新的方法;延展:通知在本類的定義裡使用類目來宣告私有方法;協議:協議宣告了可以被任何類實現的方法。
注意:這些手段只能增加類的方法,並不能用於增加例項變數,要增加類的例項變數,只能通過定義子類來間接實現。
1、類目
1)宣告類目
@inte***ce nsstring (numberconvenience)
-(nsnumber *)lengthasnumber;
@end
該宣告具有2個特點。首先,現有類位於@inte***ce關鍵字之後,其後是位於圓括號中的乙個新名稱。該宣告表示,類別的名稱是numberconvenience,而且該類別將向nsstring類中新增方法。只要保證類別名稱的唯一性,你可以向乙個類中新增任意多得類別。
其次,你可以指定希望向其新增類別的類以及類別的名稱,而且你還可以列出新增的方法,最後以@end結束。由於不能新增新實現變數,因此與類宣告不同的是,類別的宣告中沒有例項變數部分。
2)類目的侷限性
第一,無法向類中新增新的例項變數。類別沒有位置容納例項變數。
第二,名稱衝突,即類別中得方法與現有的方法重名。當發生名稱衝突時,類別具有更高的優先順序。你得類別方法將完全取代初始方法,從而無法再使用初始方法。有些程式設計人員在自己的類別方法中增加乙個字首,以確保不發生名稱衝突。
有一些技術可以克服類別無法增加新例項變數的侷限。例如,可以使用全域性字典儲存物件與你想要關聯的額外變數之間的對映。但此時你可能需要認真考慮一下,類別是否是完成當前任務的最佳選擇。
3)類目的作用
cocoa中得類別主要用於3個目的:第一,將類的實現分散到不同檔案或者不同框架中。第二,建立對私有方法的前向引用。第三,向物件新增非正式協議。
2、延展
類的延展可以看作是一種匿名的類目,類有時需要一些只為自己所見,所用的私有方法這種私有方法可以通過延展的方式來宣告,延展中定義的方法在類本身的@implementation**區域中進行實現。
定義延展
@inte***ce myobject : nsobject
- (nsnumber *)number;
@end @inte***ce myobject (setter)
- (void)setnumber:(nsnumber *)newnumber;
@end
@implementation myobject
- (nsnumber *)number
- (void)setnumber:(nsnumber *)newnumber
@end
當在定義延展的時候不提供類目名時,延展中定義的方法既被視為「必須實現」的api在這種情況下,如果方法缺少實現**,則編譯器會報警告,此時方法的實現必須出現在類主體的@implementation**塊中。
3、協議和**模式
協議只宣告了方法,不具體實現,接受協議的物件負責實現。oc的協議是由@protocol宣告的一組方法列表,要求其它的類去實現,相當於@inte***ce部分的宣告。
注意:a.確認協議時應實現協議中 @required 修飾的方法
b.可以選擇性實現 @optional 修飾的方法
c.使用[物件 conformstoprotocol:@protocol(protocol)]判斷是否遵循協議
d.協議寫在提供協議類的.h檔案裡
協議的應用--**
**模式即本身不做時間的事情,而是要求其他人去做。
Objective C中的類目和延展
類目 類別 category為已知的類增加新的方法 延展 extension 通知在本類的定義裡使用類目來宣告私有方法 1.類目方法的應用 對現有類進行擴充套件 比如 可以擴充套件cocoa touch框架中的類,在類目中增加的方法會被子類繼承,而且在執行時跟其他的方法沒有區別。作為子類的替代手段 ...
Objective C中的類目和延展
類目 為已知的類增加新的方法 延展 通知在本類的定義裡使用類目來宣告私有方法 b 一 類目 b 1.類目方法的應用 list 對現有類進行擴充套件 比如 可以擴充套件cocoa touch框架中的類,在類目中增加的方法會被子類繼承,而且在執行時跟其他的方法沒有區別。作為子類的替代手段 不需要定義和使...
Objective C中的類目和延展
類目 為已知的類增加新的方法 延展 通知在本類的定義裡使用類目來宣告私有方法 b 一 類目 b 1.類目方法的應用 list 對現有類進行擴充套件 比如 可以擴充套件cocoa touch框架中的類,在類目中增加的方法會被子類繼承,而且在執行時跟其他的方法沒有區別。作為子類的替代手段 不需要定義和使...