Block和Protocol的小结

来源:互联网 发布:淘宝上货 生产许可证 编辑:程序博客网 时间:2024/06/11 19:20

Block:

oc的另一种数据类型block

block用来保存一段代码

block的标志是^

block跟函数很像:

1:可以保存代码

2:有返回值

3:有形参

4:调用方式和函数一样

 

定义block变量:

void(^myblock)() =^{

         NSLog(@”----------------”);

};   //上面是一个没有返回值没有参数的block

 

下面定义一个有返回值有参数的block

int(^sumblock)(int  int ) = ^(int a, int b){

return a+b;

}

int c =sumblock(10,11);

//和指向函数的指针有点像。

简略写法:利用typedef

block总结:

1:如何定义block变量

int (^MyBlock)(int , int)

void(^MyBlock)()

2:如何利用block封装代码

^(int a, int b){

         return a+b;

};

//上面如果没有形参可以省略括号

 3:block访问外面的变量

block内部可以访问外面的变量

默认情况下,block内部不能修改外面的局部变量

如果给变量加上__block关键字,这个外部的局部变量就可以在block内部修改

4:利用typedef定义block类型

typedef int (^MyBlock)(int , int );

MyBlock block

MyBlock b1,b2;

记住给block变量赋值完成后要加上一个分号

 

protocol的用法:

1:可以用来声明一大堆方法(不能声明成员变量)

2:只要某个类遵守了这个协议,就相当于拥有了这个协议里面的所有方法声明

3:只要父类遵守了这个协议,就相当于子类也遵守了这个协议

格式:

@protocol 协议名称

         // 方法声明列表

@end

某个类遵守某个协议

@interface 类名:父类<协议名称>

@end

在协议里面可以给方法加上关键字

@required (默认的也是这个) // 必须实现的方法

         @required

         -(void)test;

         -(void)test2;

@optional  //可以不用实现的协议内函数

 

协议遵守协议:

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

@end

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

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

id<协议名称> 变量名

NSObject<MyProtocol>*obj

id<MyProtocol>obj2

如果没有遵守协议,编译器会爆出警告

 

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

@property(nonatomic strong)Dog<MyProtocol>*dog

@property(nonatomic strong)id<MyProtocol> dog2

协议可以写在类的声明中也可以单独写.h文件中

区分:

如果这份协议只需要这个类来遵守的话,可以将这个协议写在这个类的声明里面

如果这个协议需要多个类来遵守的时候,应该单独将协议写在.h文件中

//一般情况下,都定义在单独文件中

 

0 0
原创粉丝点击