● Block封装了⼀一段代码,可以在任何时候执⾏
● Block可以作为函数参数或者函数的返回值,⽽其本⾝又可以带输⼊参数或返回值。
● 苹果官⽅方建议尽量多使用block。在多线程、异步任务、集合遍历、集合排序、动画转场使用的很多
#import <Foundation/Foundation.h>
int main(int argc,const char * argv[])
{
@autoreleasepool {
//不带参数无返回值的块
void (^printfstr)(void)= ^(void)
{
NSLog(@"**********");
};
printfstr();
//带参数有返回值的块
double (^hypot)(double,double) = ^(double num1,double num2)
{
return sqrt(num1*num1 + num2*num2);
};
NSLog(@"%lf",hypot(3,4));
//带参数无返回值的块变量
//先只定义块变量
void (^print)(NSString *);
//将块赋给指定的块变量
print= ^(NSString * info)
{
NSLog(@"%@",info);
};
//调用块
print(@"我是一个块变量");
//块可以访问局部变量的值,但是不能够修改,否则会程序崩溃
int a = 20;
void (^ printMy)(void)= ^(void)
{
//尝试修改a的值,程序会报错;
//a=30; variable is not assignable;
NSLog(@"%i",a);
};
printMy();
a=100;
printMy();//调用结果是20不是100;
//【注】因为当程序使用块去访问局部变量时,系统在定义块时就会把局部变量的值保存在块中,而不是等到执行是时才去访问,获取局部变量的值。赋值语句位于块定义之后,故不会影响块的值。
__block int b=1;
//加__block修饰局部变量,块只会在执行的时候获取局部变量的值,并能够改变局部变量的值
void (^printb)(void) = ^(void)
{
NSLog(@"%i",b); // 1
b =5;//修改局部变量的值也是允许的
NSLog(@"%i",b); // 5
};
printb();
b=20;
printb();// 20 // 5
NSLog(@"%i",b); // 5
//使用typdef定义 block;可以快速定义多个块(只要返回值,形参类型相同)
typedef int (^myblock) (int ,int );
myblock b1,b2;
b1 = ^(int c,int d)
{
return c-d;
};
b2 = ^(int a1,int a2)
{
return a1*a2;
};
NSLog(@"%i",b1(5,2));
NSLog(@"%i",b2(5,2));
}
return 0;
}