在oc中,代码是比较常用的。它极大的方便了我们的编程。下面对代码块做一下总结。供个人学习交流之用。
代码块对象(简称代码块)是对C语言中函数的扩展。除了函数中的代码,代码块还包含变量绑定。代码块有时也被称为闭包(closure)。
代码块的声明和定义:
<returntype> (^blockname)(list of arguments) =^(arguments){body;};
下面,以具体例子来说明代码的使用
1.使用代码块
int value =3;
int (^multiplyBlock)(int number) =^(int number){
return (value * number);
};
int result = multiplyBlock(10);
NSLog(@"Result:%d",result);
这里需要注意下代码块里面访问了value,说明代码块可以访问与它同时创建的有效变量。这个特性很特别,也很重要,希望大家一定要留意。
2.直接使用代码块
使用代码块时通常不需要创建一个代码块变量,而是在代码中内联代码块的内容,通常,你会需要一个将代码块作为参数的方法或者函数
-(void)directblock:(void(^)(int a,int b))block{
block(10,20);
}
[self directblock:^(int a,int b){
NSLog(@"a:%d,b:%d",a,b);
}];
可以看到directblock函数使用了一个block类型的参数: void(^)(int a,int b),可以看到
把其写法也很好记,把block类型的声明去掉名字可以了,是不是很简单。
3.使用typedef关键字
使用typedef的好处我就不说了,直接上代码吧
typedef int (^AddtionBlock)(int a,int b);
AddtionBlock addtionBlock = ^(int a,int b){
return a+b;
};
NSLog(@"%d,%d",addtionBlock(4,5),addtionBlock(10,3));
看起来也很简单,直接在block声明的前面加上一个typedef就好了,然后就可以使用定义好的名字来定义block变量啦。
4.代码块和变量
代码块被声明后会捕捉创建点时的状态,代码块可以访问函数用到标准类型的变量
(1)本地变量
typedef double (^MKSampleMultiplyBlockRef)(void);
double a =10,b=20;
MKSampleMultiplyBlockRef multiply =^(void){return a*b;};
NSLog(@"%f",multiply());
a=20;
b=50;
NSLog(@"%f",multiply());
你认为第二个NSLog会输出什么呢?1000?答案是否定的,因为变量是本地的,代码块会在定义时复制并保存它们的状态。
(2)全局变量
typedef double (^MKSampleMultiplyBlockRef)(void);
static double a =10,b=20;
MKSampleMultiplyBlockRef multiply =^(void){return a*b;};
NSLog(@"%f",multiply());
a=20;
b=50;
NSLog(@"%f",multiply());
如果是全局变量的化,第二个NSLog就会输出1000了
(3)_block变量
本地变量会被代码块作为常量获取到。如果你想要修改他的值,必须将它们声明为可以修改的。
typedef void (^MKSampleMultiplyBlockRef)(double a,double b);
// double c=3;
// MKSampleMultiplyBlockRef mutiply=^(double a,double b){c=a*b;};
__block double c=3;
MKSampleMultiplyBlockRef mutiply=^(double a,double b){
c=a*b;};
mutiply(2,5);
NSLog(@"%f",c);
好了,以上就是代码使用的一些基础知识。另外还有关于代码块,还有一个块比较重要就是oc变量的内存管理问题。留在下一篇里讲吧。
注:本文只是作为个人复习和总结只用,里面内容大量参考了 《Objective-C 基础教程 》第2版 人民邮电出版社 周庆成 译