Block
OC的Block跟C语言的指向函数指针含义相同,只不过使用Block可以更简洁、快速的定义一个指向函数指针。
语法:
返回值类型 (^变量名)(参数列表) = ^{//函数体...}
C语言的函数指针
void method()
{
NSLog(@"C语言的函数");
}
int main(int argc, const char * argv[])
{
@autoreleasepool {
void (*myMethod)() = method;//C语言的函数指针以*号作为标识
myMethod();//调用
}
return 0;
}
OC的无参数Block:
//定义一个block数据类型的变量,名字为myBlock。
void (^myBlock)();
//为变量赋值
myBlock = ^{
NSLog(@"myBlock代码块。。");
};
//调用
myBlock();
声明并初始化
void (^myBlock)() = ^(){//括号可以省略
NSLog(@"定义了一个block并初始化");
};//数据类型 = 值;
myBlock();//调用
OC的有参数Block:
int (^sumBlock)(int,int) = ^(int a,int b)
{
return a+b;
};
int sum = sumBlock(10,25);//调用
NSLog(@"sum = %d",sum);
在Block内部修改外部的变量值,需要在变量声明时使用__block修饰。
__block int a = 20;
void (^myBlock)() = ^{
a = 30;
};
myBlock();
NSLog(@"a = %d",a);
使用typedef定义block
typedef int(^MyBlock)(int,int); //利用typedef定义block类型。
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[])
{
//创建block类型的变量
MyBlock add = ^(int a,int b){
return a + b;
};
int sum = add(10,20);
NSLog(@"sum = %d",sum);
return 0;
}