OC语言-Block与协议
OC语言-Block与协议
盘盘的灰灰 发表于1年前
OC语言-Block与协议
  • 发表于 1年前
  • 阅读 6
  • 收藏 0
  • 点赞 0
  • 评论 0

标题:腾讯云 新注册用户域名抢购1元起>>>   

  • 延展: Extension

         1). 是1个特殊的分类. 所以延展也是类的一部分.

         2). 特殊之处:

             a. 延展这个特殊的分类没有名字.

             b. 只有声明没有实现.和本类共享1个实现.

  • 延展100%的情况下不会独占1个文件. 都是将延展直接写在本类的实现文件中.

             这个时候,写在延展中的成员,就相当于是这个类的私有成员.只能在本类的实现中访问.

             外部不能访问.

     

  • block变量的声明  

         1). 虽然block变量中是用来存储1段代码的.但是1个block变量中并不是任意的1段代码都可以存进去的

     
  • 声明block变量的语法格式:       

             返回值类型 (^block变量的名称)(参数列表);

             void (^myBlock1)(); 表示声明了1个block类型的变量叫做myBlock1 这个变量中只能存储没有返回值没有参数的代码段.

             int (^myBlock2)(); 

             int (^myBlock3)(int num1,int num2);

     
  • 初始化block变量

         1). 原理: 写1个符合block要求的代码段.存储到block变量中就可以了.    

         2). 代码段的书写格式:

             ^返回值类型(参数列表){

                代码段;

             };

         3). 写1个无参数无返回值的代码段.

             ^void(){

                NSLog(@"我爱你");

                NSLog(@"我恨你");

             };

             这个时候,我们就可以将这段代码使用赋值符号存储到 无返回值无参数要求的block变量中.

             void (^myBlock1)();

             myBlock1 =  ^void(){

                 NSLog(@"我爱你");

                 NSLog(@"我恨你");

             };

             当然也可以在声明block变量的同时使用符合要求的代码段初始化. 

             void (^myBlock1)() =  ^void(){

                 NSLog(@"我爱你");

                 NSLog(@"我恨你");

             };      

         4). 有返回值的代码段.

             ^int(){

                int num1 = 10 + 20;

                return num1;

             };        

             我们就可以将这段代码赋值给符合要求的block变量.

             int (^myBlock2)() =  ^int(){

                 int num1 = 10 + 20;

                 return num1;

             };

         5). 既有参数既有返回值的代码段.

             ^int(int num1,int num2){

                int num3= num1 + num2;

                return num3;

             };      

             所以 我们可以将这个代码赋值给符合要求的block变量.

             int (^myBlock3)(int num1,int num2) =  ^int(int num1,int num2){

                 int num3= num1 + num2;

                 return num3;

             };

     

     
  • 关于block的简写.

         1). 如果我们写的代码段没有返回值.那么代码段的void可以省略.

             void (^myBlock1)() =  ^(){

                 NSLog(@"我爱你");

                 NSLog(@"我恨你");

             };

             注意,我说的是代码段的返回值如果是void可以省略,声明block变量的返回值无论是什么不可以省略.

         2). 如果我们写的代码段没有参数,那么代码段的小括弧写可以省略.

             int (^myBlock2)() =  ^int{

                 int num1 = 10 + 20;

                 return num1;

             };

             再次强调: 我们说的是代码段.

             所以,当1个代码段既没有参数,也没有返回值的适合,就只写^

             void (^myBlock1)() =  ^{

                 NSLog(@"我爱你");

                 NSLog(@"我恨你");

             };         

         3).声明block变量的时候.如果有指定参数.可以只写参数的类型而不写参数的名称;

         int (^myBlock3)(int,int) =  ^int(int num1,int num2){

             int num3= num1 + num2;

             return num3;

         };

         注意: 这个地方我们说的是声明block变量的时候 再写代码段的时候 类型和名称都要写.

         4).无论代码段是否有返回值.在写代码的时候.可以不写返回值类型 省略.

            如果在写代码段的时候,省略了返回值,这个时候系统会自动的确定返回值的类型.

            如果代码段中没有返回任何数据 那么它会认为这个代码段是没有返回值的.

            如果代码中有返回数据 返回的数据是什么类型 它就会认为这个代码段是什么类型的.

        建议: 仍然按照我们最标准的写法来写block变量和block代码段.因为这样可以提高代码的阅读性.

     
  •  关于block块访问外部变量的问题.

         1). 在block代码块的内部可以取定义在外部的变量的值, 定义在外部的局部变量和全局变量.

         2). 在block代码块的内部可以修改全局变量的值.但是不能修改定义在外部的局部变量的值.

         3). 如果你希望我们定义的局部变量可以允许在block代码的内部去修改,那么就为这个局部变量加1个__block的修饰符.

     
  •   typedef 返回值类型 (^新类型)(参数列表); 

             typedef void (^NewType)(); 代表重新定义了1个类型叫做NewType 是1个block类型 无参数无返回值的block类型

  • 协议的声明.

         @protocol 协议名称 <NSObject>

         方法的声明;

         @end

    在协议中,只能用来声明方法,协议的作用:就是专门用来写方法声明的. 
  • 类是单继承. 但是协议可以多遵守.

         1个类只能有1个父类

         但是1个类可以同时遵守多个个协议.

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

         @end

        当1个类遵守了多个协议之后,就相当于这个类拥有了所有协议中定义的方法的声明.

         那么这个类,就应该实现所有协议中的方法.     

         如果不实现,其实也不会报错.编译器只是会报警告.

         但是当创建对象,来调用这个没有实现的协议中的方法的时候,就会报错.

     
  •  在协议中,如果方法的声明被@required修饰,那么遵守这个协议的类必须要实现这个方法,否则编译器会发出警告.

         在协议中,如果方法的声明被@optional修饰,那么遵守这个协议的类如果不实现这个方法.编译器也不会报警告.

  • NSObject<协议名称> *指针名;

          这个时候,这个指针可以指向遵守了指定协议的任意对象. 否则就会报1个警告.

          NSObject<StudyProtocol> *obj = [Student new];

     

 

共有 人打赏支持
粉丝 0
博文 31
码字总数 24142
×
盘盘的灰灰
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: