《Objective-C高级编程》是一本有趣又难懂的书,全书就讲了引用计数、Block、GCD三个概念,有趣是因为讲原理、实现的部分是其它iOS专业书籍里少有的。然而每个章节不读个三五遍还是比较难理解贯通的。本文针对其中的Block部分做些简单的笔记记录,讲述Block的用法和部分实现原理,详细解说从原书中寻。
Block概要
Block:带有自动变量的匿名函数。
匿名函数:没有函数名的函数,一对{}包裹的内容是匿名函数的作用域。
自动变量:栈上声明的一个变量不是静态变量和全局变量,是不可以在这个栈内声明的匿名函数中使用的,但在Block中却可以。
虽然使用Block不用声明类,但是Block提供了类似Objective-C的类一样可以通过成员变量来保存作用域外变量值的方法,那些在Block的一对{}里使用到但却是在{}作用域以外声明的变量,就是Block截获的自动变量。
Block常规概念
Block语法
Block表达式语法:
^ 返回值类型 (参数列表) {表达式}
例如:
^ int (int count) {
return count + 1;
};
其中,可省略部分有:
返回类型,例:
^ (int count) {
return count + 1;
};
参数列表为空,则可省略,例:
^ {
NSLog(@"No Parameter");
};
即最简模式语法为:
^ {表达式}
Block类型变量
声明Block类型变量语法:
返回值类型 (^变量名)(参数列表) = Block表达式
例如,如下声明了一个变量名为blk的Block:
int (^blk)(int) = ^(int count) {
return count + 1;
};
当Block类型变量作为函数的参数时,写作:
- (void)func:(int (^)(int))blk {
NSLog(@"Param:%@", blk);
}
借助typedef可简写:
typedef int (^blk_k)(int);
- (void)func:(blk_k)blk {
NSLog(@"Param:%@", blk);
}
Block类型变量作返回值时,写作:
- (int (^)(int))funcR {
return ^(int count) {
return count ++;
};
}
借助typedef简写:
typedef int (^blk_k)(int);
- (blk_k)funcR {
return ^(int count) {
return count ++;
};
}
网友评论