黑马程序员————Objective C——protocol、block

来源:互联网 发布:行知职高图片 编辑:程序博客网 时间:2024/06/06 04:56


------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

一、protocol
   可以用来声明一大堆方法(不能声明成员变量)
   只要某个类遵守了这个协议,就相当于拥有这个协议中的所有方法声明
   只要父类遵守了某个协议,就相当于子类也遵守了

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

    2.如何遵守协议
       1> 类遵守协议
           @interface 类名 : 父类名 <协议名称1, 协议名称2>
 
           @end
 
      2> 协议遵守协议
          @protocol 协议名称 <其他协议名称1, 其他协议名称2>
 
          @end
 
    3.协议中方法声明的关键字
      1> @required (默认)
           要求实现,如果没有实现,会发出警告
 
     2> @optional
         不要求实现,怎样不会有警告
 
    4.定义一个变量的时候,限制这个变量保存的对象遵守某个协议
        类名<协议名称> *变量名;
          id<协议名称> 变量名;
        NSObject<MyProtocol> *obj;
        id<MyProtocol> obj2;
       如果没有遵守对应的协议,编译器会警告
 
   5. @property中声明的属性也可用做一个遵守协议的限制
       @property (nonatomic, strong) 类名<协议名称> *属性名;
       @property (nonatomic, strong) id<协议名称> 属性名;
      

       @property (nonatomic, strong) Dog<MyProtocol> *dog;
       @property (nonatomic, strong) id<MyProtocol> dog2;
 
    6.协议可用定义在单独.h文件中,也可用定义在某个类中
      1> 如果这个协议只用在某个类中,应该把协议定义在该类中
      2> 如果这个协议用在很多类中,就应该定义在单独文件中


    
7.分类可用定义在单独.h和.m文件中,也可用定义在原来类中
      1> 一般情况下,都是定义在单独文件
      2> 定义在原来类中的分类,只要求能看懂语法


二、block

     1.Block封装了一段代码,可以在任何时候执行
        Block可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值。
        苹果官方建议尽量多用block。在多线程、异步任务、集合遍历、集合排序、动画转场用的很多

     2.定义一般形式

        Blocks的定义:

int (^MySum)(int, int) = ^(int a, int b) {return a+b;//定义了一个叫MySum的blocks对象,它带有两个int参数,返回int。等式右边就是blocks的具体实现};

      3.Block可以访问局部变量,但是不能修改。

int sum = 10;int (^MyBlock)(int) = ^(int num) {sum++;//编译报错return num * sum;};

      如果要修改就要加关键字:__block
       __block int sum = 10;

      4.Blocks和函数指针对比

         定义函数指针
         int (*myFn)();
         定义Blocks
         int (^MyBlocks)(int,int);

        调用函数指针
        (*myFn)(10, 20);
         调用Blocks
         MyBlocks(10, 20);

      5.Blocks的赋值
         1>在声明的同时定义变量,然后赋值
            int (^MySum)(int,int) = ^(int a,int b) {
            return a + b;
                      };
        2>可先用typedef先声明类型,再定义变量进行赋值
            typedef int (^MySum)(int,int);
            MySum sum = ^(int a,int b) {
             return a + b;
            };

       6.实例

#import <Foundation/Foundation.h>typedef int (^MyBlock)(int, int);//利用typedef定义一个blockint main(){    MyBlock sumBlock;    sumBlock = ^(int a, int b) {        return a + b;    };    //建一个加法的block    MyBlock minusBlock = ^(int a, int b) {        return a - b;    };    //建一个减法的block   MyBlock multiplyBlock = ^(int a, int b) {        return a * b;    };    //建立一个乘法的block    NSLog(@"%d - %d - %d", multiplyBlock(2, 4),  sumBlock(10 , 9), minusBlock(10, 8));//调用block         return 0;}



       
       

0 0
原创粉丝点击