Objective-C protocol & delegate


應用程序的委托(官方資料)

  監控應用程序的高級行為是應用程序委托對象的責任,而應用程序委托對象是您提供的定制類實例。委托是一種避免對復雜的UIKit對象(比如缺省的UIApplication對象)進行子類化的機制。在這種機制下,您可以不進行子類化和方法重載,而是將自己的定制代碼放到委托對象中,從而避免對復雜對象進行修改。當您感興趣的事件發生時,復雜對象會將消息發送給您定制的委托對象。您可以通過這種“掛鈎”執行自己的定制代碼,實現需要的行為。

  應用程序的委托對象負責處理幾個關鍵的系統消息。每個iPhone應用程序都必須有應用程序委托對象,它可以是您希望的任何類的實例,但需要遵循UIApplicationDelegate協議,該協議的方法定義了應用程序生命周期中的某些掛鈎,您可以通過這些方法來實現定制的行為。雖然您不需要實現所有的方法,但是每個應用程序委托都應該實現“處理關鍵的應用程序任務”部分中描述的方法。

  

  協議僅僅聲明方法,用作接口,本身並不實現,遵循該協議的類則負責具體實現。比如類B遵循協議test_protocol,則類B需實現該協議中聲明的方法func;當類A需要執行方法func時,可以自己不實現func,而委托B實現。

  Demo:

 1 // 聲明協議
 2 @protocol TestProtocol<NSObject>
 3 -(void)Print;               
 4 @end
 5 
 6 @interface A : NSObject{
 7 id<TestProtocol> _delegate;
 8 }
 9 @property(retain,nonatomic) id<TestProtocol> _delegate;   
10 -(void)Start;
11 @end
12 
13 @interface B : NSObject<TestProtocol>{
14     A* _test;
15 }
16 @property (retain,nonatomic)A* _test;
17 -(void)Print;
18 @end
 1 @implementation A
 2 @synthesize _delegate;
 3 
 4 -(void)Start{
 5     if (!_delegate) {
 6         return;
 7     }
 8     [_delegate Print];
 9 }
10 
11 @end
12 
13 
14 @implementation B
15 @synthesize _test;
16 
17 -(id)init{
18     if (self = [super init]) {
19         _test = [[A alloc] init];
20         _test._delegate = self;
21     }
22     return self;
23 }
24 
25 -(void)dealloc{
26     
27 }
28 
29 -(void)Print{
30     NSLog(@"delegate-protocol_succeed");
31 }
32 
33 @end

 

  注:協議protocol有兩個修飾符:@optional和@required。被@optional修飾的方法,在采用該協議的類中可以選擇不實現,而采用@required修飾的方法,則必須實現。默認為@required。

 

Demo下載:http://files.cnblogs.com/pure/ProtocolDemo.zip


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM