首页 > 代码库 > block和protocol

block和protocol

一.Block

1.基本概念

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

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

标识符为^

// 用一个block输出n条横线            void (^lineBlock)(int) =  ^(int n)    {        for (int i = 0; i<n; i++) {            NSLog(@"----------------");        }    };    lineBlock(5);

2.如何定义block变量

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

3.如何利用block封装代码

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

4.block访问外面变量

  • block内部可以访问外面的变量
  • 默认情况下,block内部不能修改外面的局部变量
  • 给局部变量加上__block关键字,这个局部变量就可以在block内部修改

5.利用typedef定义block类型

typedef int (^MyBlock)(int, int); // 以后就可以利用MyBlock这种类型来定义block变量 MyBlock block; MyBlock b1, b2;  b1 = ^(int a, int b) {    return a - b; };  MyBlock b3 = ^(int a, int b) {    return a - b; };

二.Protocol

1.基本用途

用来声明一大堆的方法(不能声明成员变量),不能写实现。

2.特性

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

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

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

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

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

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

3.如何遵守协议

1) 类遵守协议

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

2) 协议遵守协议

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

 

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

1) @required (默认)

要求实现,如果没有实现,会发出警告

2) @optional

不要求实现,怎样不会有警告

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

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

id<协议名称> 变量名;

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

 

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

6.@property中声明的属性也可用做一个遵守协议的限制

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

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

 @property (nonatomic, strong) Dog<MyProtocol> *dog; @property (nonatomic, strong) id<MyProtocol> dog2;

 

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

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

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

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

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

2) 定义在原来类中的分类,只要求能看懂语法

 

block和protocol