黑马程序员技术交流社区
标题:
OC学习笔记12--protocol的使用场景之代理模式
[打印本页]
作者:
wowthe1st
时间:
2015-8-4 15:05
标题:
OC学习笔记12--protocol的使用场景之代理模式
使用有java和C基础同学迅速了解OC
#import <Foundation/Foundation.h>
// 定义 作为Invoker代理 需要遵守的协议
@protocol InvokerDelegate <NSObject>
- (void)invoke;
@end
// Invoker
@interface Invoker :NSObject <InvokerDelegate>
{
// 限定为只要遵守了该协议的任何类都能作为代理
id<InvokerDelegate> _delegate;
}
- (void)setDelegate:(id<InvokerDelegate>) delegate;
- (id)initWithDelegate:(id<InvokerDelegate>)delegate;
+ (id)invokerWithDelegate:(id<InvokerDelegate>)delegate;
@end
@implementation Invoker
+ (id)invokerWithDelegate:(id<InvokerDelegate>)delegate
{
return [[[self alloc] initWithDelegate:delegate] autorelease];
}
- (void)dealloc
{
NSLog(@"%@ deallocated",[self className]);
// InvokerDelegate 遵守基协议后,编译器便知道
// id<InvokerDelegate>类型变量拥有基协议中的方法
[_delegate release];
[super dealloc];
}
- (void)setDelegate:(id<InvokerDelegate>) delegate
{
if(delegate!=_delegate)
{
[_delegate release];
_delegate=[delegate retain];
}
}
- (id)initWithDelegate:(id<InvokerDelegate>)delegate
{
if(self=[super init])
{
[self setDelegate:delegate];
}
return self;
}
-(void)invoke
{
// 方法实现中直接让代理类去实现
[_delegate invoke];
}
@end
// DelegateA
@interface DelegateA :NSObject <InvokerDelegate>
+ (id)delegateA;
@end
@implementation DelegateA
+ (id)delegateA
{
return [[[self alloc] init] autorelease];
}
- (void)dealloc
{
NSLog(@"%@ deallocated",[self className]);
[super dealloc];
}
- (void)invoke
{
NSLog(@"%@ be invoked",[self className]);
}
@end
// DelegateB
@interface DelegateB :NSObject <InvokerDelegate>
+ (id)delegateB;
@end
@implementation DelegateB
+ (id)delegateB
{
return [[[self alloc] init] autorelease];
}
- (void)dealloc
{
NSLog(@"%@ deallocated",[self className]);
[super dealloc];
}
- (void)invoke
{
NSLog(@"%@ be invoked",[self className]);
}
@end
int main()
{
NSAutoreleasePool *pool =[[NSAutoreleasePool alloc] init];
Invoker * invoker=[Invoker invokerWithDelegate:[DelegateA delegateA]];
[invoker invoke];
// 设置不同代理,invoke方法做的事也不一样
// 只要对象遵守了指定协议,就能正常作为其代理
[invoker setDelegate:[DelegateB delegateB]];
[invoker invoke];
[pool drain];
return 0;
}
复制代码
protocol在代理模式中:
1>利用id<protocol>来限制代理类须遵守某个协议
1>protocol须遵守基协议,让编译器知道该id拥有基协议中的方法
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2