1.Block定义及使用
首先看下Block的定义和使用。
image.png
实际使用方法
- (void) func{
[self callbackSuccess:^(NSDictionary *success) {
NSLog(@"%@",success);
} failed:^(NSError *error) {
NSLog(@"%@",error);
}];
}
- (void) callbackSuccess:(void (^)(NSDictionary *success)) success failed:(void(^)(NSError * error)) failed {
NSDictionary *successDic = [NSDictionary dictionary];
success(successDic);
NSError *error =[ [NSError alloc] init];
failed(error);
}
Block看起来比较复杂,在OC中实际上是一个类型,定义Block也可以用typedef这样看起来比较清晰.
typedef void(^Success)(NSDictionary *dic);
typedef void(^Failed)(NSError *error);
-(void)func{
[self callbackSuccess:^(NSDictionary *success) {
NSLog(@"%@",success);
} failed:^(NSError *error) {
NSLog(@"%@",error);
}];
}
- (void)callbackSuccess:(Success)success failed:(Failed)failed
{
NSDictionary *sucDic = [NSDictionary dictionary];
success(sucDic);
NSError *error = [[NSError alloc] init];
failed(error);
}
实际上的意思为在下边的callbackSuccess方法中调用了success和failed 这两个bolck将值返还回去,只有调用了success或failed时,下面这个方法才会触发
[self callbackSuccess:^(NSDictionary *success) {
} failed:^(NSError *error) {
}];
2.堆、栈、全局Block
- 栈Block(_NSConcreteStackBlock)
当Block定义在函数内部切使用了Block内部的变量时此时Block存储在栈里,例如上文中的:
-(void)func{
[self callbackSuccess:^(NSDictionary *success) {
NSLog(@"%@",success);
} failed:^(NSError *error) {
NSLog(@"%@",error);
}];
}
栈中的Block因为是系统控制,并且该block只且只有一次执行,因为栈中的空间是可重复使用的,所以当栈中的block执行一次之后就被清除出栈了,所以无法多次使用.
- 全局Block(_NSConcreteGlobalBlock)
当Block定义在函数外部或者定义在函数内部没有使用函数内部的变量也就是仅仅定义了一下Block,此时Block为全局Block
- 堆Block(_NSConcreteMallocBlock)
当栈Block被调用的时候,栈区的Block会被复制到堆区。(栈区是系统控制,程序无法进行内存管理)。
3.Block和Delegate的区别和特点
后续更新
网友评论