zoukankan      html  css  js  c++  java
  • OC基础-protocol

    protocol(协议)的声明看起来比较向java中得一个类的接口,但是不同点在于:protocol没有父类也不能定义实例变量.

    protocol是一种特殊的程序设计结构,用于声明专门被别的类实现的方法.

    常见使用场合:

    1.需要由别的类来实现的方法

    2.声明未知类的接口

    3.两个类之间的通信

    protocol的基本特点:

       协议可以被任何类实现的方法

       协议本身不是类,他是定义了一个其他类可以实现的接口.

       类别也可以采用协议(用得不多)

    protocol中得关键字:

    @required :表示必须强制实现的方法,默认的

    @optional :表示可以选择实现的方法

    但是系统在编译时如果required修饰方法没有实现也不会报错,他只是字面的要求而已.

    //协议的声明
    #import 
    @protocol OneProtocol 
    
    //可以选择实现的方法:
    @optional
    -(void) optionalMethod1;
    -(void) optionalMethod2;
    //必须实现的方法:
    @required
    -(void) requiredMethod1;
    @end

    示例:模拟一个按钮被点击的情形

    // Button.h文件

    #import <Foundation/Foundation.h>

    // 潜规则:一般来说我们写一个协议通过称它为代理(delegate)

    // <>代表是实现某一个协议

    @protocol ButtonDelegate <NSObject>

    - (void)onClick;

    @end

    @interface Button :NSobject

    //设置按钮Button的监听器delegate

    @prooerty (nonatomic ,retain)id<ButtonDelegte>delegate;   //实例变量delegate必须是继承了ButtonDelegate协议的对象才可以成为button的监听器.

    //设置一个click函数用来模拟button被点击了

    - (void)click;

    @end

     

    // Button.m文件

     

    #import "Button.h"

    @implementation Button

    -(void)click

    {

    // 当Button被点击时就通知监听器

    [_delegate onClick];

    }

    @end

     

    //创建Button的监听器类,用于监听按钮被点击的事件

    //ButtonListener,h文件

    #import <Foundation/Foundation.h>

    #import "Button.h"

    // ButtonListener继承了Button的Buttondelegate协议,必须实现该协议的方法onClick

    // Buttonlistener 继承了Buttondelegate协议后,具有了监听Button被点击后的反应功能

    @interface ButtonListener :NSObject<ButtonDelegate>

    @end

    //ButtonListener.m文件

    #import "ButtonListener.h"

    @implementation ButtonListener

    -(void)onClick

    {

    NSLog(@"按钮被点击了!");

    }

    @end

    写法二:

    [

     #import <Foundation/Foundation.h>

     //在此处不整体导入Button.h文件,对协议进行提前声明,跟@class的用途一致

    @protocol ButtonDelegate;  

     // ButtonListener继承了Button的Buttondelegate协议,必须实现该协议的方法onClick

     // Buttonlistener 继承了Buttondelegate协议后,具有了监听Button被点击后的反应功能

     @interface ButtonListener :NSObject<ButtonDelegate>

     @end

    //ButtonListener.m文件

    #import "ButtonListener.h"

    //在.m文件中导入Button.h文件,用于导入Button.h文件的所有内容,提供协议中得onClick 方法信息.

    //方法二种的@protocol的使用参照@class来理解.两者效果和作用一样.

    #import "Button.h"

    @implementation ButtonListener

    -(void)onClick

    {

    NSLog(@"按钮被点击了!");

    }

    @end

     ]

    main 函数中的调用:

    // 初始化一个按钮

    Button *button=[[button alloc]init];

    //初始化一个监听器

    ButtonListener *listener=[[ButtonListener alloc]init];

    //设置按钮的监听器

    button.delegate=listener;

    [button click];  //触发按钮监听器执行Onclick方法;

    //补充完善:上面的onClick虽然可以被多个button对象同时调用,但是并不能区分是谁调用的该函数,所以用以下方法来完善程序.

    协议中声明onClick时使用:  -(void)onClick:(Button *)btn

    在ButtonListener.m中实现时使用如下方式:

    -(void)onClick:(Button *)btn

    {

    NSLog(@"%@按钮被点击了!",btn);

    }

    //Button中click的实现方式

    -(void)click

    {

    //如果_delegate监听器实现了onClick:方法就执行该方法

    //OC中用一种 BOOL [对象名 resondsToSelector:@selector(方法名)] 机制来判断某一个函数是否被实现

    if([_delegate resondsToSelector:@selector(onClick:)])

    {

    [_delegate onClick:self];

    }else{

    //如果监听器没有实现onClick方法就通知出来

    NSLog(@"监听器并没有实现onClick:方法");

    }

    }

    有关protocol的小知识点:

    1.一般protocol放在一个单度的文件中,command+N来快速创建该文件

    2.在.h中通常使用  @protocol 协议名; 来声明协议,而不是用#import来整体导入protocol ,在使用的时候才用#import来导入协议.(与@class相同)

    3.@protocol声明方式: @protocol 协议名1,协议名2....   继承时用: <协议名1,协议名2,....>

    4.判断某个对象是否遵循某一个协议的方法:BOOL [对象名 conformsToProtocol:@protocol(协议名)]

  • 相关阅读:
    修改sharepoint列表样式
    Zend Server 安装与配置图文教程
    安装zendstudio和破解方法及配置svn
    C#索引器
    曝光尚德机构亲身经历请大家不要上当
    不支持PowerShell 2.0版本(don't support PowerShell version 2.0. )
    SharePoint Project Server List 列表CURD操作使用rest api接口
    解决启动SQL Server Management Studio 17时报Cannot find one of more components...的问题
    Project Server2016升级安装问题项目中心无法显示
    Project Server 2016 RestAPI调用测试
  • 原文地址:https://www.cnblogs.com/lovelifeloveme/p/3887083.html
Copyright © 2011-2022 走看看