iOS中的协议与委托

转载于

http://m.blog.csdn.net/article/details?id=7818149


  协议就相当于是C++中的纯虚基类,它只能定义函数并且只能由其他类来实现。而委托则类似于Java接口,其实协议和委托之间并无必然联系,只是在Obj—C中常用协议来实现委托。

        protocol-协议,就是使用了这个协议后就要按照这个协议来办事,协议要求实现的方法就一定要实现。

        delegate-委托,顾名思义就是委托别人办事,就是当一件事情发生后,自己不处理,让别人来处理。

        注意以下几点:

1.协议声明了可以被任何类实现的方法; 
2.协议不是类,它是定义了一个其他对象可以实现的接口 ;
3.如果在某个类中实现了协议中的某个方法,也就是这个类实现了那个协议。 
4.协议经常用来实现委托对象。

5.在协议的声明中的特性关键字:

      @optional预编译指令表示可以的方法 

      @required预编译指令表示必强制的方法 

     

     下面举个例子来说明:当一个A view 里面包含了B view,而b view需要修改a view的界面,那么这个时候就需要用到委托了。

步骤如下:

1、首先定一个协议

2、a view实现协议中的方法

3、b view设置一个委托变量

4、把b view的委托变量设置成aview,意思就是,b view委托a view办事情。

5、事件发生后,用委托变量调用a view中的协议方法

具体实现时,代码可以类似于:

B_View.h:
@protocol  B_ViewDelegate<NSObject>
@optional 
-(void)touch:(id)sender;
@end
@interface  B_View:UIViewController
{}
@property(nonatomic,retain) id<B_ViewDelegate> touchDelegate;//以一个别名来声明委托
@end
B_View.m:  
@synthesize touchDelegate;  
- (id)initWithFrame:(CGRect)frame {  
if (self = [super initWithFrame:frame]) {  
 [touchDelegate  touch];//调用协议委托,委托给A_View来实现函数
}  
return self;  
}  
@end

A_View.h:
@interface:UIViewController<B_ViewDelegate>
{
B_View *myB_View;
}
@end
A_View.m:
- (void)viewWillAppear:(BOOL)animated  
{  
myB_View.touchDelegate = self; //设置委托 ,这里可以看出委托其实也可以理解为B_View中的一个属性 
[self.view addSubview: myB_View];  
}  
- (void)ontouch:(id)sender
{  
   //实现协议方法
}

        就像上面说的,其实协议和委托并无必然的联系,只是在Obj—C中我们时常用协议来实现委托,但是我们不用协议也可以实现委托。例如:

       定义一个类A:

@interface A:NSObject
-(void)print;
@end
@implement A
-(void)print
{
NSLog(“ok,print”);
}

     定义一个类B,在B中声明A的实例为B的成员变量:

@interface B:NSObject
{
   A *a_delegate;
}
@end

     然后在main()函数中实现委托机制:

void main
{
B *b=[[B alloc] init];  
A *a=[[A alloc] init];  
b.a_delegate=a; //设置b中的成员变量为a,这样就可以调用a中print方法。 
[b.a_delegate print];  
}

      还有一种方式,这种方式接近于我们所用的协议实现委托机制,但它还并没有用到协议:

首先,定义一个类B,B委托类A来实现print:

@interface B:NSObject{  
id delegate;
}  
@end 
@implement B  

-(void)callPrint{  
[self.delegate print];  
}  
@end  

然后,在类A中实现print:

@interface A:NSObject{  
B *b;  
}  
-(void)print;  
@end  
@implement A  
-(void)viewDidLoad{  
b=[[B alloc]init];  
b.delegate=self;  //设置B的代理为self(即A)
}  
-(void)print{  
NSLog(@"print was called");  
}  //在A中实现print
@end
还有一点值得提一下

       数据源几乎等同于委托,不同之处在于它同发布委托的对象之间关系。发布委托的对象并不把对于用户界面的控制转交给它,而是把数据控制交给它。发布委托的对象,通常是诸如表视图这样的视图对象。它持有数据源引用,并时不时向其索要待显示数据。数据源和委托一样,也必须遵循某种协议并至少实现协议所要求的方法。数据源负责管理模型对象的内存,并将其提供给发布委托的视图。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值