代码改变生活

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头文件中,但也可以定义在任何地方。当这个协议只有这个类使用遵守时,一般把协议写在这个类里边,当这个协议需要多个类去实现时,就写在外边单独的文件中。

 

posted on 2015-04-28 11:05  张大少。  阅读(411)  评论(0编辑  收藏  举报

导航

繁星纵变 智慧永恒