zoukankan      html  css  js  c++  java
  • OC----protocol语法

    Protocol(类似java中的接口interface)
    • 简单来说就是一系列方法的列表,其中声明的方法可以被任何类实现。这种模式一般称为代理(delegation)模式
    • 在iOS和OS X开发中,apple采用了大量的代理模式来实现MVC中View(UI控件)和Controller(控制器)的解耦
     
    在java中接口中的方法是公共的,如果你实现了接口,你要实现接口中的所有方法
    而OC中的Protocol与java中的接口不太相同,如果要实现Protocol中的方法,可以独立实现,不需要一次实现全部的Protocol内的方法
    例如:
    @protocol ButtonDelegate<NSObject>
    -(void)onClick;
    @end
    
    @interface Button:NSObject
    @property(nonatomic,retain) id<ButtonDelegate> delegate;
    @end

    点击按钮例子:

    //
    初始化一个按钮 Button*btn=[[Button alloc]init]; //初始化一个按钮的监听器 ButtonListener *listener=[[ButtonListener alloc]init]; //设置按钮的监听器 btn.delegate=listener; //点击按钮 [btn onClick];
     
     
    在Button.m文件中实现click方法:
    -(void)onClick{
       [ _delegate onClick]
    }
     
     
    在使用@protocol的时候可以用跟@class相同的用法,在声明的时候不用import.h文件,只是在实现的时候import就可以了,
     
    同样,我们可以重写click方法去实现在监听器里打印出是哪个按钮被点击了
    -(void)click{
       //按钮被点击,通知监听器,并告诉监听器,是哪个按钮被点击了
       if ([_delegate respondsToSelector:@selector(onClick:)]){
           [_delegate onClick:self];
          }else{
              NSLog(@"监听器并没有实现onClick:方法”)
    }
     
    同样的,我们可以在一个类里边同时实现两个或者多个protocol
    例如:
    @protocol Study,Learn;
    @interface Student:NSObject <Study,Learn>
     
    如果在@protocol中使用了@required关键字,那么就表示@required下边的方法都必须实现
    例如:
    @required
    -(void)test;
    -(void)test1;
    -(void)test2;
    对于@required,虽然字面上说是必须实现,但是编译器并不强求某个类必须进行实现
     
    如果在@protocol中使用了@optional关键字,那么就表示@optional下边的方法是选择实现的
    例如:
    @optional
    -(void)test4;
     
    查看某个类的对象有没有遵守某个协议,用conformsToProtocol关键字
    例如:
    if([stu conformsToProtocol:@protocol(study)]){
    }
     
    查看某个类的对象有没有实现某个方法,用respondsToSelector关键字
    例如:
    if([_delegate respondsToSelector:@selector(onClick:)]){
    }
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    iOS越狱系列(一):使用Reveal分析APP
    ios-异步消息同步问题-典型使用场景: 微信私信界面
    ios 消息跳转处理
    iOS开发UI篇—IOS CoreText.framework --- 基本用法
    IOS开发之实现App消息推送(最新)
    Thread 1: signal SIGABRT-内存管理的陋习
    别用symbolicatecrash来解析crash Log了by 风之枫
    通过崩溃trace来查找问题原因 .
    Xcode 6视图调试小贴士
    调试message send to deallocated instance问题
  • 原文地址:https://www.cnblogs.com/hqzxbb/p/4390877.html
Copyright © 2011-2022 走看看