Objective-C 委託、非正式協議、正式協議

來源:互聯網
上載者:User

標籤:

一、概念:
1、委託(delegate,也叫代理):當一個對象接受到某個事件或者通知的時候,會向它的Delegate物件查詢它是否能夠響應這個事件或者通知,如果可以,這個對象就會給它的Delegate對象發送一個訊息(執行一個方法調用)。在這種機制下,您可以不進行子類化和方法重載,而是將自己的定製代碼放到委派物件中,從而避免對複雜物件進行修改。當您感興趣的事件發生時,複雜物件會將訊息發送給您定製的委派物件。您可以通過這種“掛鈎”執行自己的定製代碼,實現需要的行為。
2、非正式協議(informal protocol):使用類別category來實現,非正式協議是NSObject的一個類別,這樣任何類的對象都可以作為委派物件來使用,它可以列出對象能夠執行的所有方法,這樣用來實現委託, 我們可以使用選取器來判斷該非正式協議中是否有這個方法。
3、正式協議(formal protocol):是一個命名的方法列表,與非正式協議相比不同的是,它要求顯示的採用協議,採用協議的方法是在類的@interface聲明中列出協議的名稱,此時,實現協議的類應該遵守協議,承諾實現協議中的所有方法,否則編譯器將會發出警告。
正式協議協議類似於C++的純虛函數,協議只有聲明,沒有實現,用來在子類中實現,協議中的方法有兩類屬性,@required(預設)和@optional兩種,@required屬性的要求實現協議的類必須要實現這種方法,而@optional屬性的方法則不要求,如果不確定協議是否被實現,可以使用respondsToSelector:@select()來判斷。

 

二、應用舉例

源碼如下: 

 

 

/*********簡單的委託舉例************/

@interface A :NSObject

-(void)Log;

@end

@implementation A

-(void)Log{

    NSLog(@"This is A Log");

}

@end

 

@interface B :NSObject{

   A* delegate;

}

@property (nonatomic,retain)A* delegate;

-(void)callLog;

@end

@implementation B

@synthesize delegate;

-(id)init{

   if (self = [superinit] ) {

        delegate = [[Aalloc]init];

    }

    returnself;

}

-(void)callLog{

    

    NSLog(@"This is B callLog");

    [self.delegateLog];

}

@end

/*********簡單的委託舉例************/

 

/*********簡單的正式協議舉例************/

//協議--begain

@protocol myProtocol

//可選實現的

@optional

-(void)optional_print;

//要求實現的

@required

-(void)required_print;

@end

//協議--end

 

//使用協議的類--begain

@interface  myClass :NSObject<myProtocol>

-(void)print;

@end

@implementation myClass

-(void)print{

    NSLog(@"This is myClass print");

}

//實現可選實現的協議

-(void)optional_print{

    NSLog(@"This is protocol optional_print");

}

//實現必須實現的協議

-(void)required_print{

    NSLog(@"This is protocol required_print");

}

@end

//使用協議的類--end

/*********簡單的正式協議舉例************/

 

 

/*********簡單的非正式協議舉例************/

@interface NSObject(myCategory)

-(void)informal_protocol_print;

@end

@implementation NSObject(myCategory)

-(void)informal_protocol_print{

    NSLog(@"This is informal_protocol_print");

}

@end

/*********簡單的非正式協議舉例************/

 

 

/*********正式協議實現委託舉例************/

//協議--begain

@protocol myProtocolEx

//可選實現的

@optional

-(void)optional_print;

//要求實現的

@required

-(void)required_print;

@end

//協議--end

 

@interface myClassEx :NSObject{

   id<myProtocolEx> delegate;

}

@property (nonatomic,assign)id<myProtocolEx> delegate;

-(void)print;

@end

@implementation myClassEx

@synthesize delegate;

-(void)print{

    NSLog(@"This is myClassEx print");

    [self.delegateoptional_print];

    [self.delegaterequired_print];

}

@end

 

@interface myCall :NSObject<myProtocol>{

   myClassEx *cls;

}

@property (nonatomic,retain)myClassEx *cls;

-(void)callPrint;

@end

@implementation myCall

@synthesize cls;

-(id)init{

   if (self=[superinit]) {

        myClassEx* c = [[myClassExalloc]init];

       self.cls = c;

       cls.delegate = (id)self;

        [crelease];

    }

    returnself;

}

-(void)callPrint{

    NSLog(@"This is myCall callPrint");

    [self.clsprint];

}

-(void)optional_print{

    NSLog(@"This is myCall implemented formal protocol optional_print");

}

-(void)required_print{

    NSLog(@"This is myCall implemented formal protocol required_print");

}

 

@end

/*********正式協議實現委託舉例************/

 

int main(int argc,char *argv[])

{

    @autoreleasepool {

        

       //委託的使用

       B* b = [[B alloc]init];

        [bcallLog];

        

        [b informal_protocol_print];//非正式協議的使用

        NSLog(@"---------------------------------");

        

       //協議的使用

        myClass *cls = [[myClassalloc]init];

        [clsprint];

        [clsoptional_print];

        [clsrequired_print];

        

        [cls informal_protocol_print];//非正式協議的使用

        NSLog(@"---------------------------------");

        

       //正式協議實現委託的使用

       myCall *call = [[myCallalloc]init];

        [callcallPrint];

        NSLog(@"---------------------------------");

        

       return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));

    }

}

http://blog.csdn.net/jjunjoe/article/details/7846025

 

Objective-C 委託、非正式協議、正式協議

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.