• Object-C——其他语法


    一、protocol协议

         1、协议的定义

    @protocol 协议名称 <NSObject>
      // 方法声明列表....
     @end

         2、如何遵守协议
           ①  类遵守协议

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

          ②  协议遵守协议

    @protocol 协议名称 <其他协议名称1, 其他协议名称2>
     
     @end

         ③  协议中方法声明的关键字

     1> @required (默认)
       要求实现,如果没有实现,会发出警告
    1 @required
    2 - (void)test;
    3 - (void)test2;
    2> @optional
       不要求实现,怎样不会有警告

       

    1 @optional
    2 - (void)test3;

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

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

               id<协议名称> 变量名;

    NSObject<MyProtocol> *obj;
     id<MyProtocol> obj2;

             如果没有遵守对应的协议,编译器会警告

             ⑤  @property中的声明的属性也可用作一个遵守协议的限制

    @property (nonatomic, strong) 类名<协议名称> *属性名;
     @property (nonatomic, strong) id<协议名称> 属性名;
    
     @property (nonatomic, strong) Dog<MyProtocol> *dog;
     @property (nonatomic, strong) id<MyProtocol> dog2

            ⑥  协议可用定义在单独.h文件中,也可以定义在某个类中

               *如果这个协议只用在某个类中,应该把协议定义在该类中

               *如果这个协议用在很多类中,就应该定义在单独文件中

            ⑦  分类可用定义在单独.h和.m文件中,也可用定义在原来类中

               *一般情况下,都是定义在单独文件

          3、程序举例

     1 // 要求obj3保存的对象必须是遵守是MyProtocol这个协议
     2     
     3     //NSObject<MyProtocol> *obj3 = [[NSObject alloc] init];
     4     
     5     NSObject<MyProtocol> *obj3 = [[Person alloc] init];
     6     
     7     obj3 = nil;
     8     
     9     
    10     id<MyProtocol> obj4 = [[Person alloc] init];
    11     
    12     obj4 = nil;
    13     
    14     // 要求obj5,保存的对象必须遵守MyProtocol3、并且继承了Person
    15     Person<MyProtocol3> *obj5 = [[Person alloc] init];
    16     
    17     obj5 = nil;

    二、block
          block封装了一段代码,可以在任何时候执行,block可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值

          1、 block的定义       

    1 int (^sumBlock)(int, int);
    2  void (^myBlock)();

          2、 利用block封装代码

    ^(int a, int b) {
        return a - b;
     };
     
     ^() {
        NSLog(@"----------");
     };
     
     ^ {
        NSLog(@"----------");
     };
     

          3、block访问外面的变量
             ①  block内部可以访问外面的变量

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

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

     1 void test3()
     2 {
     3     int a = 10;
     4     __block int b = 20;
     5     
     6     void (^block)();
     7     
     8     block = ^{
     9         // block内部可以访问外面的变量
    10         //NSLog(@"a = %d", a);
    11         
    12         // 默认情况下,block内部不能修改外面的局部变量
    13         // a = 20;
    14         
    15         // 给局部变量加上__block关键字,这个局部变量就可以在block内部修改
    16         b = 25;
    17     };
    18     
    19     
    20     block();
    21 }

          4、 利用typedef定义block类型

     1  MyBlock block;
     2  MyBlock b1, b2;
     3  
     4  b1 = ^(int a, int b) {
     5     return a - b;
     6  };
     7  
     8  MyBlock b3 = ^(int a, int b) {
     9     return a - b;
    10  };
    11  */
    12 
    13 typedef int (*SumP)(int, int);
    14 
    15 
    16 typedef int (^MyBlock)(int, int);
    17 
    18 int sum(int a, int b)
    19 {
    20     return a + b;
    21 }

          

            

  • 相关阅读:
    Lucene.NET中Field.Index 和 Field.Store的几种属性的用法
    WP7学习笔记(三)
    sql注入
    JSP数据库开发实例
    oracle命令大全(转)
    .net个人涉及
    JavaScript的错误处理之onerror事件的使用方法
    脚本问题。调试
    做到了,你就成熟
    ea8.0
  • 原文地址:https://www.cnblogs.com/gaizuojia/p/4357607.html
Copyright © 2020-2023  润新知