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。