——- android培训、java培训、ios培训期待与您交流!
一、block基础用法
block是OC中的一种数据类型,在iOS开发中被广泛使用
^是Block的特有标记
作用:
block用于封装一段代码,可以在任何时候使用。
block可以作为函数参数或者函数返回值,而其本身又可以带参数或返回值。
定义block变量
返回值数据类型(^变量名称)(参数类型,参数类型,...);
void(^变量名称)();
利用block封装代码:
返回值数据类型(^变量名称)(参数类型,参数类型,...);
变量名称=^(参数类型 形参名,参数类型 形参名,...){
代码内容....
代码内容....
代码内容....
};
实例代码:
int main()
{
//没有参数的block
int a=10;
void (^myBlock1)()=^{
a=11;
NSLog(@"a=%d",a);
}
myBlock1();
//有参数的block并有返回值
int (^myBlock2)(int,int);
myBlock2=^(int m,int n){
return m+n;
}
myBlock2(10,11);
return 0;
}
注意:
1.block内部可以访问外面的变量
2.默认情况下,block内部不能修改外面的局部变量
3.给局部变量加上_block关键字,这个局部变量可以在block内部修改
利用typedef定义block类型
typedef 返回值类型 (^类型名)(参数,参数,...);
可以通过类型名声明变量
typedef void(^MyBlock)();
MyBlock myBlock=^{
NSLog(@"This is myBlock.");
}
myBlock();
二、protocol(协议)
只是用来声明方法
基本用途:
1.用来声明方法,不能声明成员变量
2.只要某个类遵守了这个协议,就相当于拥有了这个协议的所有方法声明
3.只要父类遵守了某个协议,那么子类也必定遵守
定义方法
@protocol 协议名称
声明方法
@end
遵守协议方式
@interface 类名:NSObject <协议名称,协议名称,...>
@end
注意:
类继承时,只能写一个,而协议可以是多个。
一旦遵守某个协议,就拥有这份协议中所有的方法声明
协议中可以声明某个方法要求它实现,也可以不必要求它实现
@required 要求实现,否则会提示警告,默认为@required
@optional 可以不实现
声明方式
@protocol myProtocol
- (void) test1;//必须实现
@required
- (void)test2;//必须实现
@optional
- (void)test3;//可以不实现该方法
@end
协议遵守协议
类似继承的原理,一个协议遵守了某个协议,那么,这个协议就拥有那个协议中的所有方法的声明
基协议
基协议的名称也为NSObject,最根本最基本的协议
NSObject协议中声明很多最基本的方法:description、retain、release等
三、总结
1.使用block的好处
1.程序运行的过程中保存需要的代码,可在后面进行调用
2.局部变量前加_block,可以在block中修改局部变量值
3.代替函数,执行一些操作
2.使用protocol的好处
1.限制类的类型,确保一些类中拥有特定的方法
2.为类提供方法的声明
3.为类添加更多的方法
3.协议的提前声明
引用协议时使用@protocol 协议名称,说明这个协议仅仅只是协议,并不知道这个协议中的内容,当真正要使用协议内容的时候,再使用@import 引入协议。
3.@property中属性的声明也可以遵守协议
@property(nonatomic,strong)id<协议名称> 类名;
@property(nonatomic,strong) 类名<协议名称> *类名;