iOSiOS-进阶学习iOS开发

谈谈Objective-C中的协议

2017-07-20  本文已影响110人  吴与伦

协议简述

协议(protocol)是oc中的一个重要的语言特性,协议中定义了一些方法,若某个类想要实现这个协议中的一系列方法,则必须遵守这个协议,这个类对象被称为"委托对象" , 即为"代理"。这也说明这种模式是单向的,消息的发送方(委托方) 需要知道接收方(代理方)是谁,即只需要知道它的代理方是否遵守了协议( protocol)反过来是不需要的。

协议的两种模式

这两种模式分别为委托模式(delegate)和数据源模式(dataSource),区别在于信息的流向不同.

QQ20170720-0@2x.png

协议的作用

协议的声明与使用

为了演示此模式,举一个UIWebView中的UIWebViewDelegate作为例子:

@protocol UIWebViewDelegate <NSObject>

@optional

// 将NSURLRequest对象传递给代理方,代理方由此判断将是否加载此网页,并将结果返回给委托方做处理,这个方法很好的说明了协议用于对象之间的相互通信。
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;
// 通知代理方网页开始加载
- (void)webViewDidStartLoad:(UIWebView *)webView;
// 通知代理方网页加载完成
- (void)webViewDidFinishLoad:(UIWebView *)webView;
// 通知代理方网页加载失败,并将NSError 对象传递给代理方。
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error;

@end
    if ([self.delegate respondsToSelector:@selector(webViewDidStartLoad:)]) {
        [self.delegate webViewDidStartLoad:self];
    }

这段代码的意思是来判断委托对象是否实现了相关方法。如果实现了就调用,如果没有实现就不执行任何操作。这样委托对象就可以选择性的实现相关的方法了。即使self.delegate = nil,即没有设置委托对象的时候,程序也能照常运行,因为给nil发送消息将使if语句的值成为false。

- (void)webViewDidStartLoad:(UIWebView *)webView{

    if(webView == self.webViewA){
        // do something;
    } else if (webView == self.webViewB){
       // do something;
    }
}

@interface ViewController ()<UIWebViewDelegate>
@end

@implementation ViewController

- (void)viewDidLoad {
    
    [super viewDidLoad];
    
    UIWebView *webView = [[UIWebView alloc] init];
    webView.frame = self.view.bounds;
    [webView loadRequest:request]
    // 成为webView的委托对象,即代理。
    webView.delegate = self;
    [self.view addSubview:webView];
    
}

#pragma mark -- 根据需求选择性的实现协议中的方法

- (void)webViewDidStartLoad:(UIWebView *)webView{
    
}

- (void)webViewDidFinishLoad:(UIWebView *)webView{
    
}

- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error{
    
}

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{
    
    return YES;
}

总结

参考资料

*《Effective Objective-C 2.0 编写高质量iOS与OS X代码的52个有效方法》中的第4章 第 23条:通过委托与数据源协议进行对象间通信。

上一篇 下一篇

猜你喜欢

热点阅读