OC中block的使用:
block:Block对象提供了创建特殊函数的方法,函数体可用C,Objective-C,C++等C类的语言做表达式. 在其他的语言环境中,block变量可能会被叫做"闭包(closure)", 而在这里,除非和标准C术语的一段(block)代码混淆的情况之外,一般称为"blocks"。(前面不拉不拉一大堆的意思是你不需要懂,你只要知道就行了,关于block的定义可以去看官方的API)。
为何要使用block
一个block就是一块匿名的代码块:
- 和函数一样有含类型的参数列表
- 有直接声明或可推断出的返回值
- 可以获得当前词法范围的状态
- 有能力修改当前词法范围的状态
- 可以和当前词法范围的其他block共同修改状态
- 可以持续共享和修改当前词法范围的状态,甚至在当前词法范围销毁之后
你可以copy一个block还可以将其传到别的线程以延后执行 (或本线程的执行循环里). 编译器和运行时会把block里用到的所有变量保存到该block的所有拷贝的生存期后。尽管blocks可以由纯C或C++写成,但block本身始终是一个Objective-C变量.
优点:
blocks基于两大理由,是传统回调函数的优秀替代品:
- 允许你把具体实现代码写在调用该方法的地方. Blocks也经常是framework的方法参数.
- 可以访存局部变量. 不需要像以前的回调一样,把在操作后所有需要用到的数据封装成特定的数据结构, 你完全可以直接访问局部变量.
如何使用:
//重定义一下
typedef float (^BlockType) (float,float);
<span style="font-family:FangSong_GB2312;font-size:14px;">//block变量的定义 和 block 语法块的实现
//在Block中 有一个"^" 起标识作用
//block 语法块 其实就是一个匿名函数,他相比较其它函数 可以进行函数嵌套定义
void(^sayHiBlock)() = ^ void ()
{
NSLog(@"认识我吗?");
};//定义了一个数据类型 void(^)() ,变量名为 sayHiBlock ,初值为 ^void (){NSLog(@"认识我吗?");} 的一个block 变量
//block的使用
sayHiBlock();
//求两个数之和 的block
int (^sumValueBlock)(int,int) = ^ int (int a,int b){
return a + b;
};
int max = sumValueBlock (5,6);
NSLog(@"sum = %d",max);
//求两个数只差
int(^subBlock)(int, int) = ^ int (int a, int b)
{
return a - b;
};
NSLog(@"%d",subBlock(16,11));
int (^exchengeBlock)(NSString *) = ^ int (NSString *a)
{
return [a intValue];
};
NSLog(@"%d",exchengeBlock(@"1232131"));
//加
BlockType sumBlock = ^float (float a,float b){
return a + b;
};
NSLog(@"和 = %.2f",sumBlock(5,4));
//减
BlockType subBlock1 = ^float (float a, float b){
return a - b;
};
NSLog(@"差 = %.2f",subBlock1(9,17));
//乘
BlockType mulBlock = ^float (float a, float b){
return a * b;
};
NSLog(@"积 = %.2f",mulBlock(19,7));
//除
BlockType divBlock = ^float (float a, float b){
return a / b;
};
NSLog(@"商 = %.2f",divBlock(9,7));</span>
<span style="font-family:FangSong_GB2312;font-size:14px;">// //__block 告诉编译器 将所修饰的变量 在block 内部仍然识别为可以改变的量 弱引用
__block int a = 10;
int (^testBlock)() = ^int (){
a = 15; //对于局部变量 在block 内部被识别为 不可改变的的量
b ++; //对于全局变量 在block 内仍然识别为变量
NSLog(@"a = %d",a);
NSLog(@"b = %d",b);
return a;
};
testBlock();</span>
Tips:
<span style="font-family:FangSong_GB2312;font-size:14px;"> //NSString
NSString *str = @"糖";
NSMutableString *muSet = [NSMutableString stringWithFormat:@"%@",str];
NSArray *arr = @[@"1",@"2",@"3"];
//等价于 [NSArray arrayWithObjects: @"1",@"2",@"3",nil];
NSMutableArray *muArr = [NSMutableArray arrayWithArray:arr];
[arr objectAtIndex:1];
arr[1];
//字典 NSDictionary
NSDictionary *dic = @{@"name1": @"笑笑语法",@"name2":@"语法糖",@"name3":@"字面量"};
NSLog(@"%@",dic);
NSLog(@"%@",dic[@"name3"]); //等价于 [dic valueForKey:@"name3"];
NSMutableDictionary *muDic = [NSMutableDictionary dictionaryWithDictionary:dic];
//NSNumber
NSNumber *num = @12;// [NSNumber numberWithInt:12];
</span>