zoukankan      html  css  js  c++  java
  • IOS开发protocol使用

    1.什么是protocol?

    protocol(协议)是用来定义对象的属性和行为,用于回调。

    2.protocol分类?

    协议中有三个修饰关键字@required和@optional和@property。

    3.三个修饰关键字的作用

    被@required修饰的方法为必须实现的方法;

    被@optional修饰的方法为可选实现的方法;

    @property用于修饰属性。


    一、定义一个protocol

    新建文件的时候不要选择objective-c Class;而要选择objective-c protocol。

    #import <Foundation/Foundation.h>
    
    @protocol ClassADelegate <NSObject>
    @required//必须实现
    - (void)methodA;
    @optional//可选实现
    - (void)methodB;
    @property
    NSString *_str;
    @end

    二、定义protocol的实现(只是定义,对外宣称自己实现了

    A.创建一个objective-c Class,在头文件中实现 ClassADelegate。

    #import <Foundation/Foundation.h>
    #import "ClassADelegate.h"
    
    @interface ClassA : NSObject <ClassADelegate>
    
    @end

    3.调用protocol中的方法(类似Java中调用interface中的方法)

    #import "ViewController.h"
    #import "ClassA.h"
    
    @interface ViewController ()
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        
        ClassA *a = [[ClassA alloc] init];
        [a methodA];
        [a methodB];
    }
    4.运行程序,发现报错

    ProtocolAndDelegate[373:60b] -[ClassA methodA]: unrecognized selector sent to instance 0x17001dff0
    原因分析:在第二步里面,只是定义了实现,为真正实现。

    在ClassA.m文件的顶部会有警告提示:

    	Method 'methodA' in protocol not implemented
    

    methodB被@optional修饰,是可选实现,所有没有警告提示;但是运行的时候依然会报错。

    5.真正实现协议中的方法

    #import "ClassA.h"
    
    
    @implementation ClassA 
    
    - (void)methodA{
        NSLog(@"ClassA methodA exec");
    }
    
    - (void)methodB{
        NSLog(@"ClassA methodB exec");
    }
    
    @end

    6.再次运行程序

    2014-09-25 14:27:17.751 ProtocolAndDelegate[380:60b] ClassA methodA exec
    2014-09-25 14:27:17.752 ProtocolAndDelegate[380:60b] ClassA methodB exec

    7.respondsToSelector容错处理

    协议中的方法如果没有被真正实现,程序是可以编译通过的,但是在运行的时候会出错。特别的是可选实现的方法,未被真正实现的可能性极高,直接调用protocol方法出错的可能性极高。

    规定:“出席今天的宴会,可以打领带,也可以不打领带”
    
    绅士打了领带;屌丝为打领带。
    
    此时如果直接去所有赴宴者领带上的花纹,就会出现异常。先判断下这个赴宴者有没有打领带,如果有再获取领带上的花纹。

    处理办法如下:

    - (void)viewDidLoad
    {
        [super viewDidLoad];
        
        ClassA *a = [[ClassA alloc] init];
        if ([a respondsToSelector:@selector(methodA)]) {
            [a methodA];
        }
        if ([a respondsToSelector:@selector(methodB)]) {
            [a methodB];
        }
    }


  • 相关阅读:
    jQuery火箭图标返回顶部代码
    jQuery火箭图标返回顶部代码
    jQuery火箭图标返回顶部代码
    jQuery火箭图标返回顶部代码
    jQuery火箭图标返回顶部代码
    jQuery火箭图标返回顶部代码
    jQuery火箭图标返回顶部代码
    jQuery火箭图标返回顶部代码
    jQuery火箭图标返回顶部代码
    jQuery火箭图标返回顶部代码
  • 原文地址:https://www.cnblogs.com/pengyan5945/p/5218317.html
Copyright © 2011-2022 走看看