//代码块:普通代码块 构造代码块 静态代码块
//一.定义一个普通代码块
//定义方式1 返回类型 (^代码块名称) (参数类型) = ^(参数类型 参数名){};
//1.无返回类型的代码块 参数类型可为空也可为其他类型
void (^my_block1) (void) = ^(void)
{
NSLog(@"hello world");
};
my_block1();
void (^my_block) (int) = ^(int number)
{
number = 1;//带参数进入代码块运算 结果为5 当进入作用域里面的时候给number再次赋值 此时5将被覆盖 结果number为1
NSLog(@"%i",number);
};
my_block(5);
//2.有返回类型的代码块
int (^my_blockI) (int number) = ^(int number)
{
return number * number;
};
int num = my_blockI(10);
NSLog(@"%i",num);
//定义方式2 返回类型 (^代码块名称) (参数类型);
// 代码块名称 = ^(参数类型 参数名){};
void (^my_block2) (int);
my_block2 = ^(int number)
{
NSLog(@"%i",number);
};
my_block2(9);
//带两个参数的代码块
int (^sumBlock) (int,int) = ^(int number1,int number2)
{
return number1 + number2;
};
int result = sumBlock(5,9);
NSLog(@"result:%i",result);
//在代码块外边定义的变量可以在代码块里面使用
int addSum = 0;
for (int i=1; i<=10; i++) {
addSum = sumBlock(addSum,i);
}
NSLog(@"sum:%i",addSum);
//二.构造代码块
//用构造块的关键字定义代码块 typedef 注意:参数类型和参数的个数要保持一致
typedef void (^my_block3)(int);//构建了一个代码块类型
my_block3 num1 = ^(int number)
{
NSLog(@"num:%i",number);
};
num1(8);
//数组的一个方法 代码块可以作为一个参数 该方法可对一个数组进行排序 sortedArrayUsingComparator
NSArray *array = @[@"hello",@"person",@"father",@"hunter"];
NSArray *arr = [array sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
return [obj1 compare:obj2];
}];
NSLog(@"%@",arr);
//--------局部变量
int a=10, b=20;
typedef int (^multiplyBlock)(void);
multiplyBlock multiply = ^(void)
{
return a * b;
};
NSLog(@"result1=%i",multiply());//输出结果为200
a=20,b=30;
NSLog(@"result2=%i",multiply());//输出结果还是200 a b的值没有发生改变
//---------全局变量
static int c=10, d=20;
typedef int (^multiplyBlock2)(void);
multiplyBlock2 multiplyI = ^(void)
{
return c*d;
};
NSLog(@"result3=%i",multiplyI());//输出结果为200
c=20,d=30;
NSLog(@"result4=%i",multiplyI());//输出结果为600 a b的值发生改变
// static void (^addblock)(int,int) = ^(int i,int sum)
// {
// for (i=0; i<11; i++) {
// sum += i;
// }
//
// NSLog(@"result=%i",sum);
// };
// addblock(0,0);
//三.静态代码块
//代码块的递归调用 (递归调用的意思是自己可以调用自己) 递归调用的前提是代码块变量必须是全局变量或静态变量
static void(^const block)(int) = ^(int i)
{
if (i>0) {
NSLog(@"num:%i",i);
block(i-1);
}
};
block(3);
//递归方式计算1到10的和
static int(^sum_block)(int) = ^(int number1)
{
if (number1<11) {
// NSLog(@"sum:%i",number1);
number1 += sum_block(number1+1);
NSLog(@"sum:%i",number1);
}
return number1;
};
sum_block(1);
static int i =10;
typedef int (^block3)(void);
block3 tem = ^(void)
{
i += 1;
return i;
};
NSLog(@"%i,%i",i,tem());
//在代码块中可以使用代码块改变全局变量
void(^block4)(void) = ^(void)
{
global++;//在主函数外定义
NSLog(@"%d",global);
};
//此时在代码块外的全局变量的值也发生了改变
block4();
NSLog(@"%i",global);
//用__block在代码块内部可以修改代码块外部的值
__block int a1= 10;
int (^block5)(int,int) = ^(int data1,int data2)
{
a1 = data1 * data2;
return a1;
};
NSLog(@"dataResult:%i",block5(3,5));//此时a1的结果为15 a1的值被修改