block的基本概念
Block对象是一个C级别的语法和运行机制
Block对象包含着一组状态数据,程序运行时产生影响。
可用Block来写一些可以传到API的函数语句,可选择性地存储。
并可以使用多线程。作为一个回调,Block特别的有用,因为block既包含了回调期间的代码,又包含了执行期间的需要的数据。
block同时兼容c oc c++
block基本用法
int (^myBlock)(int)=^(int num){};
第一个int表示返回值
第二个int表示参数类型
第三个int后表示参数名字
{}快对象的主体部分。
void(^myBlock4)()=^(){};
使用Block变量
myBlock4)();
优化之后
函数指针别名
typedef int (*NewType)(int x,int y);
NewType f1,f2,f3;
block 的typedef
格式:type 返回值类型(^block变量名是新别名)(参数类型列表);
typedef int ^(Block)(int,int);
Block b1; //Block 是一个类型
block访问外部变量
block内部可以访问block外部的变量将外部变量的值以const方式拷贝一份到block所在的内存中 一个新的内存空间变量
block内部
不允许修改外部的变量
__block int m =10; //栈区地址
void(^myBlock)()=^{
m=100; //__block不再以const的方式拷贝,允许修改 修改的还是copy后block空间内部的变量
};
%d%p,m,&m
block运行后m的地址和值是在block更改之后的值和地址。
静态变量和全局变量 在加不加__block都会直接引用变量地址,也就意味着可以修改变量的值,在没有加__block参数的情况下。
堆 block 是对block copy得来,对全局block copy不会有任何作用返回的依然是全局block
全局block 定义在函数外面的block是global的;另外如果函数内部的block,但是没有捕获任何自动变量,那么他也是全局的。
栈block 区别为是否引用了外部变量
常量变量————不加__block类型block会引用常量的地址(浅copy)加__block类型block会去引用常量变量的地址。
block应用场景
void work (void (^workBlock())//block类型的变量workblock作为函数的参数
{
}
typedef void (^workBlock)();
workBlock w;
w=^{
NSLog(@"sdffdsfsf");
}
作为函数返回值
workBlock test(){
}
block使用技巧和注意
1.block助记符
inlineblock 快捷创建block
点击xcode右下角{}按钮
之后将你想快捷的代码选中之后往{}下的区域拖拽
编辑Completion shortcut 也就是助记符字母
之后将 类型选中 改成<#type#> 变量名 改成<#name#>
删除选中助记符 按delete键
2.我们在定义block变量的时候,形参类型及个数 这个位置处可以
加上形参名称
void test (int(^block)(int x,int y)){
}
test之后回车就会自动填充两个变量 xy
void(^myBlock4)()=^{};
|
|