標籤:
類目:為已知的類增加新的方法;注意:類目裡面只能寫方法,不能寫聲明和屬性,所以,類目不能作為介面來用
1、類目無法向已有類中添加執行個體變數。
2、如果類目中的方法和已有類中的方法名稱衝突時,類目中的方法優先順序高,如果方法名衝突,已有類中的原始方法便無法使用。
3、在使用類目的時候,最好是將自己擴充的方法和原始方法區分開來。
1、類目方法的應用:
1)對現有類進行擴充:如:可以擴充Cocoatouch架構中的類,在類目中增加的方法會被子類繼承,而且在運行時跟其他的方法沒有區別。
2)作為子類的替代手段:不需要定義和使用一個子類,可以通過類目直接向已有的類裡增加方法。
3)對類中的方法歸類:利用catigory把一個龐大的類劃分為小塊來分別進行開發,從而更好地對類中的方法進行更新和維護。
2、類目方法的局限性:
1)無法向類目中添加
新的執行個體變數,類目沒有位置來容納執行個體變數。如果想增加類的執行個體變數,只能通過定義子類的方式。
2)如若,在類目中覆蓋先後類的方法。這樣會引起super訊息的斷裂,因為類目總的方法具有更高的優先順序,因此,一般不要覆蓋現有類中的方法。
3、類目的定義:
類目的命名規則:類名+擴充方法,如“NSString+Revert”。類目的介面聲明與類的定義十分相似,但類目不繼承父類,只需要帶有一個括弧,表明該類目的主要用途。
4、舉例說明:
NSString+Revert.h檔案:
NSString+Revert.m檔案:
延展:通知在本類的定義裡使用類目來聲明私人方法;
(1).延展的作用就是定義自己的私人方法。
(2).在自己類的實現檔案中添加類目(匿名類目)來聲明私人方法。(只有本類的.m檔案中才能使用)。
(3).形式和類目相同,不用新建立檔案,只是把類目的interface地方的檔案放在了你需要擴充的類的.m檔案裡邊。
類的延展可看成是一種匿名的類目,類有時需要一些只有自己看得見的,所用的私人方法可以通過延展的方式來聲明,延展中定義的方法在類本身的@implementation代碼地區中進行實現。
當在定義延展的時候不提供類目名時,延展中定義的方法既被視為“必須實現”的API在這種情況下,如果方法沒有實現代碼,那麼編譯器會警示告,這個時候方法的實現就一定要出現在類主體的@implementation代碼塊中了。
協議
(1).協議聲明了可以被其他的類實現的方法。協議本身必不會去實現。
(2).協議不是類,只是一個其他對象可以實現的介面。
注意:
@required 必須方法 (預設)
@optional 可選方法
Girl.h檔案中
#import <Foundation/Foundation.h>#warning ?????????? 1.聲明協議 ??????????@protocol MarriageDelegate <NSObject>@required //必須方法(預設)- (void)makeMoney;- (void)satisfyHer;@optional //可選方法- (void)cooking;@end@interface Girl : NSObject#warning ?????????? 2.設定代理人屬性 ??????????@property (nonatomic, assign) id<Marriage> delegate;- (void)buybuybuy;@end
Girl.m檔案中
#import "Girl.h"@implementation Girl- (void)buybuybuy{#warning ?????????? 3.代理人執行方法 ?????????? [self.delegate makeMoney];}@end
Boy.h檔案中
#import <Foundation/Foundation.h>#import "Girl.h"#warning ?????????? 4.簽訂協議 (當前類中要實現必須方法) ??????????@interface Boy : NSObject <MarriageDelegate>@end
Boy.m檔案中
#import "Boy.h"@implementation Boy#warning ?????????? 6.實現協議中聲明的必須方法 ??????????- (void)makeMoney{ NSLog(@"賺錢");}- (void)satisfyHer{ NSLog(@"親吻");}@end
協議示範
//////////協議示範//////////#import <Foundation/Foundation.h>#import "Girl.h"#import "Boy.h"int main(int argc, const char * argv[]) { //////////使用代理////////// Girl *girl = [[Girl alloc] init]; Boy *boy = [[Boy alloc] init];#warning ?????????? 5.指定代理人 ?????????? girl.delegate = boy; [girl buybuybuy]; //輸出: 賺錢 //判斷是否對象是否遵循某些協議 BOOL result = [girl conformsToProtocol:@protocol(Marriage)]; if (result) { NSLog(@"遵循Marriage協議"); }else{ NSLog(@"不遵循Marriage協議"); } //輸出: 不遵循Marriage協議 return 0;}
本文整理了簡書Luisx的文章和51CTO藍鷗張浩的部落格,然後自己整理的,希望大家對類目、延展和協議有個新的認識。
iOS類目、延展和協議