block是语言的的扩展功能,它是一种带有自动变量(局部变量)的匿名函数.
/************************对Block的理解****************************/
/*
*****block就是一段可执行的代码(代码块),它像函数指针一样,相当于一个可执行的函数******
1> block的定义:可以定义在函数外部,也可以定义在函数内部,在block中也可以定义block
a.定义block的别名,关键字: typedef
2> block的基本使用
a.有参数有返回值的block 注:常用,重点
b.有参数无返回值的block
c.无参数有返回值的block
d.无参数无返回值的block
3> block的常用形式
a.将block作为方法或者函数的参数使用 注:常用,重点
b.将block作为方法或者函数的返回值使用
4> block访问外部变量
在C中的变量作用域
1)变量只在所在的最小花括号内,从定义开始到花括号结束起作用
2)在内部作用域中允许访问外部作用域的变量,如果在内部定义同名的变量,则外部的变量在当前花括号内无效
上述结论在block中同样有效
在block中访问外部变量时,不能修改变量的值
如果想要在block中修改外部变量的值,变量必须用__block修饰
*/
#pragma -mark block的基本使用
/*
//有参数有返回值的block
//int (^myBlock)(int,int);
// 1.求两个数字的和
int (^myBlock)(int num1,int num2) = ^(int num1,int num2){
int result = num1 + num2;
return result;
};
// 2.求两个数字累加的和
int (^sumBlock)(int num1,int num2) = ^(int num1,int num2){
int result = 0;
for (int i = num1; i <= num2; i++)
result += i;
return result;
};
// 3.求两个数的连续乘积
int (^mulBlock)(int num1,int num2) = ^(int num1,int num2){
int result = 1;
for (int i = num1;i <= num2;i++){
result *= i;
}
return result;
};
*/
#pragma -mark block的定义
/*
void (^a)();//声明一个无参数无返回值的block类型变量,变量名为a
typedef void (^aa)(); //由类型aa声明的变量是无参数返回值的block类型
*/
#pragma -mark block的常用形式
/*
a.将block作为函数的参数
//定义一个block类型
typedef void (^Block)();
//定义一个函数,参数是block类型
void func1(Block foo){
//在函数中调用传入的block
foo();
}
*/
/*
//利用block遍历C语言数组
typedef void (^Block)(int index, int value);
void func(int array[],int length, Block myblock){
for (int i = 0; i < length;i++){
myblock(i,array[i]);
}
}
*/
/*
typedef void (^Block)();
Block func1(){
int num =12;
NSLog(@"%p",&num);
Block myBlock = ^{
NSLog(@"%p",&num);
NSLog(@"%d",num);
};
return myBlock;
}
*/
intmain(intargc,constchar* argv[]) {
@autoreleasepool{
/*
int sum1 = myBlock(1,2);
NSLog(@"%d",sum1);
int sum2 =sumBlock(1,100);
NSLog(@"%d",sum2);
int mul = mulBlock(1,10);
NSLog(@"%d",mul);
*/
/*
aa testBlock;
testBlock = ^{
NSLog(@"一个无参数无返回值的block");
};
testBlock();
//在block中定义一个block
aa (^block1)() = ^{
aa block2;
block2 = ^{
NSLog(@"一个定义在block中的block!");
};
return block2;
};
aa func = block1();
func();
*/
/*
Block myBlock = ^{
NSLog(@"block作为函数参数使用");
};
func1(myBlock);
*/
/*
int array[] = {1,2,3,4,5};
Block myblock = ^(int index,int value){
NSLog(@"%d---------%d",index,value);
};
func(array, 5, myblock);
//在开发中一般没有先定义一个block,再将参数传入的,而是直接在函数或者方法的参数处写block的代码块
func(array, 5, ^(int index, int value) {
NSLog(@"%d-----------%d",index,value);
});
*/
/*
//int num = 12;
////定义一个block,在block中访问变量
//void (^block)() = ^{
//NSLog(@"%d",num);
//};
//block();
//Block myBlock1 = func1();
//myBlock1();
//
//通过__block修饰变量,在block中可以改变变量的值
__block int num = 123;
NSLog(@"main: &num = %p",&num);
void (^block)() = ^{
NSLog(@"block: num = %d",num);
NSLog(@"block: &num = %p",&num);
num = 456;
NSLog(@"block: num = %d",num);
NSLog(@"block: &num = %p",&num);
};
NSLog(@"main: num = %d",num);
NSLog(@"main: &num = %p",&num);
block();
NSLog(@"main: num = %d",num);
NSLog(@"main: &num = %p",&num);
*/
}
return0;
}