block基本使用
- 在日常的开发中,我们经常会用到block,或者说是使用block来减少我们的代码量,比如说:控制器之间的传值,虽然使用代理等也可以实现,但是使用代理的时候代码量比较大,这个时候使用block就会很方便。
- 最常用的就是在处理网络请求的时候,有返回值的时候需要执行的代码,自己封装的时候通常都是使用block(当然了,AFNetworking内部就是使用了大量的block)
-
block的作用
:block的作用和函数和方法很像,就是用来保存一段代码,等到需要的时候再去调用
block的定义
- 想知道Block如何定义??在Xcode中输入
inlineBlock
,将会出现的代码段就是Block的定义方法.
returnType(^blockName)(parameterTypes) = ^(parameters) {
statements
};
// 注意:当有参数的时候,左右两边的写法是不一样的,左边只需要参数的类型,不需要参数名,但是右边的需要参数类型和参数
// 有返回值有参数的
返回值(^block名称)(参数列表) = ^(参数列表){
};
//没有返回值有参数
void(^block名称)(参数列表) =^(参数列表){
};
//没有返回值没有参数
void(^block名称)() = ^{
};
使用
- 定义成属性
-
定义成属性的时候需要使用copy,也不需要带“”*
- 在ARC中可以使用strong和copy,但是在MRC中只能使用copy
// 第一种方法
// 先定义一个别名
typedef void(^YWBlock)(NSString *name);
// 声明一个属性
@property(nonatomic, copy) YWBlock ywBlock;
// 第二种方法
// 直接写在属性中
@property(nonatomic, copy) void(^YWBlockType)(NSString *name);
// 推荐使用这种方法,block的定义写在方法声明中,这样看起来比较直观
// 在方法实现的时候能看到里面有什么参数,是什么类型的
- (void)testWithSuccess:(void(^)(NSString *str1, int tt))success;
// 这种方式声明的也没错,但是阅读性不好
// 在方法实现中也不好用
typedef void(^failedBlock)(NSString *str1, int tt);
- (void)testWithFailed:(failedBlock)failed;