zoukankan      html  css  js  c++  java
  • OC学习笔记 block 和 Protocol

    前天夜晚下大暴雨 电闪雷鸣 机房停电。补上block

    BLOCK

    BLOCK是什么?苹果推荐的类型,效率高,在运行中保存代码。用来封装和保存代码,有点像函数,BLOCK可以在任何时候执行。

    BOLCK和函数的相似性:(1)可以保存代码(2)有返回值(3)有形参(4)调用方式一样。

    // 定义一个无参数block

     1 // 定义一个无参数block
     2     void (^blockios)();
     3     blockios  = ^{
     4         NSLog(@"第一一个block");
     5     };
     6     
     7     void (^blocks)() =^(){
     8         NSLog(@"第一一个block");
     9     };
    10     blocks();// 运行block
    11     //无形参block可以省略等号右边的括号
    12     void (^MyBlocks)() = ^{
    13     };
    14     MyBlocks();// 运行block

    练习

     1 //计算两个整数的和
     2     int (^sumBlock)(int,int) = ^(int a,int b)
     3     {
     4         return a + b;
     5     };
     6     int c = sumBlock(3,6);
     7     NSLog(@"%d",c);
     8     
     9     
    10     //用有参数block打印6条横线
    11     void (^Myline)(int) = ^(int n)
    12     {
    13         for (int i = 0; i < n; i++) {
    14             NSLog(@"----------------");
    15         }
    16     };
    17     Myline(6);

    用typedef  定义Block 省略每次都需重新定义的block语法  在类名前 头文件上定义 让代码更简洁

    定义对象的语法前加关键字typedef,剩下的不变,原本定义的对象标识符换成类型标识符,对应语义从定义一个对象改成定义一个类型别名。
    1 typedef int (^MyBlock)(int,int);//定义一个有返回值有形参block
    2 typedef void (^Myblocks)(int,int);//定义一个无返回值有形参block
    3 typedef void (^MyBlocksNo)();// 定义一个无参数block

    赋值代码

     1  MyBlock minusBlock;
     2     minusBlock = ^(int a,int b)
     3     {
     4         return a - b;
     5     };
     6     
     7     MyBlock sumBlock = ^(int a,int b)
     8     {
     9         return a + b;
    10     };
    11     
    12     NSLog(@"%d-%d",minusBlock(9,8),sumBlock(6,6));
    13     
    14     Myblocks jiafa = ^(int a,int b)
    15     {
    16         NSLog(@"%d",a + b);
    17     };
    18     jiafa(6,6);
    19     
    20     MyBlocksNo newBlock =^{
    21         NSLog(@"无参数block");
    22     };
    23     newBlock();
    24 //连续用block变量定义2个block
    25     MyBlock jia,sum;
    26     jia = ^(int a,int b){
    27         return a + b;
    28     };
    29     sum = ^(int c, int d)
    30     {
    31         return c + d;
    32     };

    block内部只能改变外部有关键字__block声明的成员变量

        int a = 6;
      __block  int b = 9;//_ _block(两个横杠)
        void (^blockos)();
      blockos = ^{
    //      a = 9; // variable is not assignable (missing_block type specifier) block内部使用外部变量错误提示:需要添加关键字__block
          b = 6;
      };

    总结

     1   /*
     2      1>如何定义block变量
     3      int (^blocks)(int,int);
     4      void (^blocks)();
     5      2>利用block封装代码的几种方式
     6      ^ (int a,int b){
     7      return a + b;
     8      };
     9      
    10      ^(){
    11      NSLog(@"无参数block");
    12      };
    13      
    14      ^{
    15      NSLog(@"无参数block");
    16      };
    17      3>block访问外面变量
    18      block内部可以访问外部变量
    19      默认情况下,block内部不能修改外面局部变量
    20      给局部变量加上_block关键字,这个局部变量就可以在block内部修改。
    21      4>利用typedf定义block类型
    22      typedf int (^MyBlock)(int,int);//最常用定义block
    23      MyBlock myblock;//定义一个block
    24      MyBlock sum1,sum2;//连续定义两个block
    25      给block 赋值
    26      sum1 = ^(int a,int b){
    27      return a  + b;
    28      };
    29      MyBlock sum3 = ^(int a,int b)
    30      {
    31      return a - b;
    32      };
    33      
    34     */

    附学习代码

      1 //
      2 //  main.m
      3 //  Block
      4 //
      5 //  Created by zjj on 15/4/27.
      6 //  Copyright (c) 2015年 zjj. All rights reserved.
      7 //
      8 
      9 #import <Foundation/Foundation.h>
     10     typedef int (^MyBlock)(int,int);
     11     typedef void (^Myblocks)(int,int);
     12     typedef void (^MyBlocksNo)();
     13 int main()
     14 {
     15     /*
     16      1>如何定义block变量
     17      int (^blocks)(int,int);
     18      void (^blocks)();
     19      2>利用block封装代码的几种方式
     20      ^ (int a,int b){
     21      return a + b;
     22      };
     23      
     24      ^(){
     25      NSLog(@"无参数block");
     26      };
     27      
     28      ^{
     29      NSLog(@"无参数block");
     30      };
     31      3>block访问外面变量
     32      block内部可以访问外部变量
     33      默认情况下,block内部不能修改外面局部变量
     34      给局部变量加上_block关键字,这个局部变量就可以在block内部修改。
     35      4>利用typedf定义block类型
     36      typedf int (^MyBlock)(int,int);//最常用定义block
     37      MyBlock myblock;//定义一个block
     38      MyBlock sum1,sum2;//连续定义两个block
     39      给block 赋值
     40      sum1 = ^(int a,int b){
     41      return a  + b;
     42      };
     43      MyBlock sum3 = ^(int a,int b)
     44      {
     45      return a - b;
     46      };
     47      
     48     */
     49     int a = 6;
     50   __block  int b = 9;
     51     void (^blockos)();
     52   blockos = ^{
     53 //      a = 9; // variable is not assignable (missing_block type specifier) block内部使用外部变量错误提示:需要添加关键字__block
     54       b = 6;
     55   };
     56     
     57     return 0;
     58 }
     59 void test2()
     60 {
     61     MyBlock minusBlock;
     62     minusBlock = ^(int a,int b)
     63     {
     64         return a - b;
     65     };
     66     
     67     MyBlock sumBlock = ^(int a,int b)
     68     {
     69         return a + b;
     70     };
     71     
     72     NSLog(@"%d-%d",minusBlock(9,8),sumBlock(6,6));
     73     
     74     Myblocks jiafa = ^(int a,int b)
     75     {
     76         NSLog(@"%d",a + b);
     77     };
     78     jiafa(6,6);
     79     
     80     MyBlocksNo newBlock =^{
     81         NSLog(@"无参数block");
     82     };
     83     newBlock();
     84 //连续用block变量定义2个block
     85     MyBlock jia,sum;
     86     jia = ^(int a,int b){
     87         return a + b;
     88     };
     89     sum = ^(int c, int d)
     90     {
     91         return c + d;
     92     };
     93 }
     94 
     95 void tets1()
     96 {
     97     //计算两个整数的和
     98     int (^sumBlock)(int,int) = ^(int a,int b)
     99     {
    100         return a + b;
    101     };
    102     int c = sumBlock(3,6);
    103     NSLog(@"%d",c);
    104     
    105     
    106     //用有参数block打印6条横线
    107     void (^Myline)(int) = ^(int n)
    108     {
    109         for (int i = 0; i < n; i++) {
    110             NSLog(@"----------------");
    111         }
    112     };
    113     Myline(6);
    114 }
    115 void tets()
    116 {
    117     // 定义一个无参数block
    118     void (^blockios)();
    119     blockios  = ^{
    120         NSLog(@"第一一个block");
    121     };
    122     
    123     void (^blocks)() =^(){
    124         NSLog(@"第一一个block");
    125     };
    126     blocks();// 运行block
    127     //无形参block可以省略等号右边的括号
    128     void (^MyBlocks)() = ^{
    129     };
    130     MyBlocks();// 运行block
    131 }

     

    Protocol(协议)

    (一)简介

    1.Protocol:就一个用途,用来声明一大堆的方法(不能声明成员变量),不能写实现。

    2.只要某个类遵守了这个协议,就拥有了这个协议中的所有方法声明。

    3.只要父类遵守了某个协议,那么子类也遵守。

    4.Protocol声明的方法可以让任何类去实现,protocol就是协议。

    5.OC不能继承多个类(单继承)但是能够遵守多个协议。继承(:),遵守协议(< >)

    6.基协议:<NSObject>是基协议,是最根本最基本的协议,其中声明了很多最基本的方法。

    7.协议可以遵守协议,一个协议遵守了另一个协议,就可以拥有另一份协议中的方法声明。

    创建一个协议

    xcode 6.2 在创建oc 类列表里面选择protocol 

    协议里面写一些待实现的方法名。

     1 //
     2 //  MyProtocol.h
     3 //  protocol
     4 //
     5 //  Created by zjj on 15/4/27.
     6 //  Copyright (c) 2015年 zjj. All rights reserved.
     7 //
     8 
     9 #import <Foundation/Foundation.h>
    10 
    11 @protocol MyProtocol
    12 
    13 //@required 要求实现,不实现就会发出警告 目的在于程序员的交流。默认实现
    14 //@optional 不要求实现 实不实实现都不发出警告。
    15 - (void)test;
    16 @required
    17 - (void)test1;
    18 @optional
    19 - (void)test2;
    20 - (void)test4;
    21 @end

    遵守协议 <>

     1 #import <Foundation/Foundation.h>
     2 //#import "MyProtocol.h"
     3 //MyProtocol2#import "MyProtocol2.h"
     4 //#import "MyProtocol3.h"
     5 @class Hashiqi;
     6 @protocol MyProtocol;
     7 @protocol MyProtocol2;
     8 @protocol MyProtocol3;
     9 
    10 // 声明协议方法 <>
    11 //只要一个类遵循了谋一份协议就能拥有这份协议中的所有方法声明
    12 @interface Person : NSObject <MyProtocol2,MyProtocol3>
    13 @property (nonatomic, strong) id<MyProtocol2> obj;
    14 @property (nonatomic, strong) Hashiqi *dog;
    15 @end

    完成协议中的方法实现

     1 #import "Person.h"
     2 
     3 @implementation Person
     4 
     5 - (void)haha2
     6 {
     7 
     8 }
     9 - (void)hehe
    10 {
    11 
    12 }
    13 - (void)test
    14 {
    15 
    16 }
    17 - (void)test1
    18 {
    19 
    20 }
    21 - (void)haha
    22 {
    23 
    24 }
    25 @end

    协议遵循协议

    创建一个协议  MyProtocol1 和 一个协议 MyProtocol2  

     1 //
     2 //  MyProtocol1.h
     3 //  协议遵循协议
     4 //
     5 //  Created by zjj on 15/4/28.
     6 //  Copyright (c) 2015年 zjj. All rights reserved.
     7 //
     8 
     9 #import <Foundation/Foundation.h>
    10 
    11 @protocol MyProtocol1 <NSObject>
    12 - (void)eat;
    13 @end

    让 MyProtocol2 遵守 MyProtocol1  协议

     1 //
     2 //  MyProtocol2.h
     3 //  协议遵循协议
     4 //
     5 //  Created by zjj on 15/4/28.
     6 //  Copyright (c) 2015年 zjj. All rights reserved.
     7 //
     8 
     9 #import <Foundation/Foundation.h>
    10 
    11 #import "MyProtocol1.h"
    12 //@protocol MyProtocol1;//code 6.2使用该协议声明会报错
    13 
    14 @protocol MyProtocol2 <MyProtocol1>
    15 - (void)cry;
    16 @optional
    17 - (void)color;
    18 @end

    类的遵循协议2

     1 //
     2 //  cat.h
     3 //  协议遵循协议
     4 //
     5 //  Created by zjj on 15/4/28.
     6 //  Copyright (c) 2015年 zjj. All rights reserved.
     7 //
     8 
     9 #import <Foundation/Foundation.h>
    10 #import "MyProtocol2.h"
    11 //@protocol MyProtocol2;
    12 
    13 @interface Cat : NSObject <MyProtocol2>
    14 
    15 @end

    完成类中所遵循协议实现

     1 //
     2 //  Cat.m
     3 //  协议遵循协议
     4 //
     5 //  Created by zjj on 15/4/28.
     6 //  Copyright (c) 2015年 zjj. All rights reserved.
     7 //
     8 
     9 #import "Cat.h"
    10 //#import "MyProtocol2.h"
    11 @implementation Cat
    12 - (void)cry
    13 {
    14     NSLog(@"猫咪叫");
    15 }
    16 - (void)eat
    17 {
    18     NSLog(@"猫甜食");
    19 }
    20 @end

    测试

     1 //
     2 //  main.m
     3 //  协议遵循协议
     4 //
     5 //  Created by zjj on 15/4/28.
     6 //  Copyright (c) 2015年 zjj. All rights reserved.
     7 //
     8 
     9 #import <Foundation/Foundation.h>
    10 #import "Cat.h"
    11 int main(int argc, const char * argv[]) {
    12     Cat *cat = [[Cat alloc]init];
    13     [cat eat];
    14     [cat  cry];
    15     return 0;
    16 }
    2015-04-28 13:54:32.900 协议遵循协议[682:24363] 猫甜食
    2015-04-28 13:54:32.903 协议遵循协议[682:24363] 猫咪叫
    Program ended with exit code: 0

    协议总结

    oc里只有单继承 可以遵守多协议

    1.协议的定义

    @protocol 协议名称 <NSObject>

    //方法声明列表

    @end;

    2.如何遵守协议

    (1)类遵守协议

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

    @end

    (2)协议遵守协议

    @protocol 协议名称 <其他协议名称>

    @end;

    3.协议方法声明中的关键字

    (1)required (默认)要求实现,若没有实现则警告但不报错

    (2)Optional 不要求实现

    4.定义变量时遵守协议的限制

    类名<协议名称> *变量名    NSObject<.Myprotocol> *obj;

    Id  <协议名称>  变量名   id  <.Myprotocol> obj1;

     

    5.Property中声明的属性也可以做遵守协议的限制

    @property (nonatomic ,strong ) 类名<协议名称> *属性名;

    @property (nonatomic ,strong ) id<协议名称>  属性名;

     

    6.补充知识:协议本身写在.h头文件中,但也可以定义在任何地方。当这个协议只有这个类使用遵守时,一般把协议写在这个类里边,当这个协议需要多个类去实现时,就写在外边单独的文件中。

  • 相关阅读:
    PAT A1023 Have Fun with Numbers (20) [⼤整数运算 高精度]
    算法笔记-数学问题-高精-大整数
    PAT A1130 Infix Expression (25) [中序遍历]
    PAT A1130 Infix Expression (25分) [二叉树中序遍历 中缀表达式]
    PAT A1129 Recommendation System (25) [set的应⽤,运算符重载]
    PAT A1118 Birds in Forest (25) [并查集]
    PAT A1124 Raffle for Weibo Followers (20分) [map vector]
    C++ STL
    PAT A1121 Damn Single (25) [map set hash]
    算法笔记-易错记录
  • 原文地址:https://www.cnblogs.com/zhangdashao/p/4462430.html
Copyright © 2011-2022 走看看