iOS中的协议与委托
2016-01-27 11:52
330 查看
转载于
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中的协议方法
具体实现时,代码可以类似于:
就像上面说的,其实协议和委托并无必然的联系,只是在Obj—C中我们时常用协议来实现委托,但是我们不用协议也可以实现委托。例如:
定义一个类A:
定义一个类B,在B中声明A的实例为B的成员变量:
然后在main()函数中实现委托机制:
还有一种方式,这种方式接近于我们所用的协议实现委托机制,但它还并没有用到协议:
首先,定义一个类B,B委托类A来实现print:
然后,在类A中实现print:
数据源几乎等同于委托,不同之处在于它同发布委托的对象之间关系。发布委托的对象并不把对于用户界面的控制转交给它,而是把数据控制交给它。发布委托的对象,通常是诸如表视图这样的视图对象。它持有数据源引用,并时不时向其索要待显示数据。数据源和委托一样,也必须遵循某种协议并至少实现协议所要求的方法。数据源负责管理模型对象的内存,并将其提供给发布委托的视图。
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
数据源几乎等同于委托,不同之处在于它同发布委托的对象之间关系。发布委托的对象并不把对于用户界面的控制转交给它,而是把数据控制交给它。发布委托的对象,通常是诸如表视图这样的视图对象。它持有数据源引用,并时不时向其索要待显示数据。数据源和委托一样,也必须遵循某种协议并至少实现协议所要求的方法。数据源负责管理模型对象的内存,并将其提供给发布委托的视图。
相关文章推荐
- iOS开发-进阶:企业级应用Plist文件模板
- iOS开发-工具:Xcode7 做ipa企业级分发(In-House模式)详细步骤
- iOS开发-进阶:长按手势执行两次解决办法
- XCode对自带的SVN操作
- ios客户端websocket的helloworld
- ios集成支付宝 报错 rsa_private read error : private key is NULL解决方法
- iOS开发-进阶:MOV格式视频转MP4格式
- iOS7 NavigationController 右滑手势失效问题
- iOS开发-基础:获取指定路径文件大小
- [iOS]iPhone上传项目遇到的问题
- IOS 跳转页面
- iOS视频背景视图
- iOS开发-基础:数据类型
- iOS开发Facebook POP动效库使用教程
- ios MVP模式
- iOS-生成随机数
- iOS获取设置的推送是否打开的方法
- iOS开发-基础:keychain的使用
- IOS-TextField控件详解
- iOS:使用代理模式监听开关状态改变事件