OC中新增的数据类型
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; }