block 是c 语言机制,block是数据类型,可以用来声明变量
block的基本使用语法
定义格式
返回值类型(^block变量名)(参数类型);
赋值格式
block变量名 = ^(行参列表){
//block语句快
}
使用格式
block变量名(实参);
如:
定义一个无参无返回值
void (^myblock)();
myblock = ^(){
NSLog(@"我是block 的代码块");
};
myblock = ^{
for(int i = 0; i < 10; i++){
NSLog(@"i = %d", i);
}
};
myblock();
无参有返回值
int (^myblock)();
myblock = ^(){
int a = 10;
return a;
};
myblock(10);
int (^ myblock)();
有参无返回值
void (^myblock)(int);
myblock = ^(int a){
NSLog(@"a= %d",a);
};
myblock(10);
有参有返回值
int (^myblock)(int,int ) =^ (inta,int b){
return a+b;
};
int s = myblock(10,20);
NSLog(@"s= %d",s);
block 访外部变量的总结
1)在block内部可以访问block外部的变量
2)block内部也可以定义和block外部的同名的变量(局部变量),此时局部变量会暂时屏蔽外部变量的作用域
3)默认的情况下,在block内部不可以修改block外部的变量,block 在内部使用外部变量的时候,会把变量以const的形式拷贝一份
4)给局部变量加上__block关键字,则这个局部变量可以在block内部进行修改。
int main(int argc, const char *argv[]) {
@autoreleasepool {
//在block外部定义变量n
intn = 10;
//打印出变量n的值和地址
NSLog(@"n = %d,add =%p",n,&n);
//在block内部访问外部的变量,病打印出变量n的地址
void(^myblock)()= ^(){
NSLog(@"n =%d,add = %p",n,&n);
};
myblock();
n= 100;
NSLog(@"n = %d,add =%p",n,&n);
}
return0;
}
运行结果为
2015-08-09 10:38:04.134 block访问外部变量[1779:233264] n = 10,add = 0x7fff5fbff7fc
2015-08-09 10:38:04.135 block访问外部变量[1779:233264] n = 10,add = 0x100100510
2015-08-09 10:38:04.135 block访问外部变量[1779:233264] n = 100,add = 0x7fff5fbff7fc
block 作为函数的返回值
//给无参无返回值的block起个别名
typedef void(^myblock)();
myblock test(){
return^{
NSLog(@"xxxx");
};
}
int main(int argc, const char *argv[]) {
@autoreleasepool {
myblockbb = test();
bb();
}
return 0;
}