前言:
cover.png这本书是同学推荐的,现在将一些知识点概括出来。
本书分为三大部分,依次为:自动引用计数,Blocks, GCD。
由于之前有翻过一些关于内存管理的一些文章,所以我把自动引用计数放在最后才读。这篇文章为Blocks篇第一篇。
正文:
什么是Blocks?
Blocks 是 c 语言的扩充功能。用一句话表示:带有局部变量的匿名函数。(所谓匿名函数,就是不带名称的函数)
blocks语法
^retrunType(parameter){
content...
}
与一般的 c 语言函数定义相比有两点不同:
- 没有函数名
- 2.带有“^”
因OS X,iOS的应用程序源代码中大量地使用Block,所以插入记号“^”易于查找。
returnType可以省略,此时变为
^(parameter){
content...
}
如果表达式中没有return语句,使用void类型;如果表达式有多个return语句,所有的返回值类型必须相同。
参数也可以省略,如果你不需要参数的话;
此时语法为:
^{
content...
}
Blocks类型变量
给Block赋值:
int (^block)(int) = ^(int count){ return count + 1;};
再看设置函数的返回值为Block变量:
int (^func())(int) {
return ^(int count){ return count + 1;};
}
从上面两块代码可以看出,跟着 “^” 的名字后者函数名,表示了一个block。
当然还有更加清晰的表达:
typedef int (^block_t)(int);
block_t block = ^(int count) { return count + 1;};
block_t fun(){ return ^(int count) { return count + 1;}; }
最后补充一点:
这样使会发生编译错误的:
const char text[] = "hello";
void (^block)(void) = ^{
printf("%c", text[4]);
};
这样不会发生错误:
const char *text = "hello";
void (^block)(void) = ^{
printf("%c", text[4]);
};
这是因为在现在的Block中,不支持c 语言数组,不过可以使用指针代替;
这也说明了指针和数组是不一样的。
END
网友评论