iOS類目、延展和協議

來源:互聯網
上載者:User

標籤:

類目:為已知的類增加新的方法;注意:類目裡面只能寫方法,不能寫聲明和屬性,所以,類目不能作為介面來用

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類目、延展和協議

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.