zoukankan      html  css  js  c++  java
  • Objective-C Block数据类型 @protocol关键字

    Block数据类型

    Block封装了一段代码 可以在任何时候执行

    Block可以作为函数参数或者函数的返回值 而其本身又可以带输入参数或返回值

    苹果官方建议尽量多用Block 在多线程 异步任务 集合遍历 集合排序 动画转场用的很多

    定义Block变量

    void (^myBlock) ();

    int (^sunBlock) (int, int);

    利用Block封装代码

    ^ {

      NSLog(@"==========");

    };

    ^() {

      NSLog(@"=========");

    };

    ^(int a, int b) {

      return a + b;

    };

    Block访问外面变量

    Block 内部可以访问外面的变量

    默认情况下 Block内部不能修改外面的局部变量

    给局部变量加上__block关键字 这个局部变量就可以在Block内部修改

    利用typedef定义Block类型

    typedef int (^MyBlock) (int, int); //以后就可以利用MyBlock这种类型来定义Block变量

    MyBlock block;

    MyBlock b1, b2;

    b1 = ^(int a, int b) {

      return a + b;

    };

    MyBlock b3 = ^(int a, int b) {

      return a + b;

    };

    @protocol关键字

    可以用来声明一大堆方法 (不能声明成员变量)

    只要某个类遵守了这个协议 就相当于拥有这个协议中的所有方法声明

    只要父类遵守了某个协议 就相当于子类也遵守了

    协议的编写格式

    @protocol 协议名称 <NSObject>

    //方法声明列表

    @end

    某个类遵守协议

    @interface 类名 : 父类 <协议名称1, ...>

    @end

    协议遵守协议

    一个协议遵守了另外一个协议 就可以拥有另一个协议的所有方法声明

    @protocol 协议名称 <协议名称1, ...>

    //方法声明列表

    @end

    协议中方法声明的关键字

    @required 要求实现 不实现会有警告 (默认)

    @optionnal 可选实现

    基协议

    NSObject是一个基类 任何其他类最终都要继承它

    还有一个NSObject基协议 声明了许多最基本的方法 比如 description retain release 等等

    建议每一个新的协议都遵守NSObject基协议

    定义一个变量时 限制这个变量保存的对象遵守某个协议

    类名<协议名称> *变量名;

    id<协议名称> 变量名;

    NSObject<MyProtocol> *obj = [[NSObject alloc] init];

    @property (nonatomic, strong) id<MyProtocol> obj;

    如果没有遵守对应的协议 编译器就会报错

  • 相关阅读:
    linux使用tar命令打包压缩时排除某个文件夹或文件
    SEO误区之——静态化页面
    Usage of API documented as @since1.6+
    JAVA多线程售票问题
    nginx基本配置与参数说明
    ElasticSearch搜索实例含高亮显示及搜索的特殊字符过滤
    实例讲解Nginx下的rewrite规则
    postgresql之ctid的浅谈
    【转载】PostgreSQL分区表(Table Partitioning)应用
    PostgreSQL中使用外部表
  • 原文地址:https://www.cnblogs.com/huangyi-427/p/4613842.html
Copyright © 2011-2022 走看看