Block
//定义一个求两个数最大值函数
int maxValue (int ,int);
//函数的实现
int maxValue (int a, int b){
return a > b ? a : b;
}
//函数指针 (调用可以用 p 或者 maxValue)
int (* p)(int,int) = maxValue;
int max = p(24, 48);
block是一个匿名函数,也是一个函数,只不过没有名字而已。也叫语法块。
把函数名去掉剩余的部分就是函数类型。
对于Block 的定义:
函数的返回值类型 (^ block 变量名)(参数列表)= ^ 返回值类型(可以省略)(参数列标(形参名不可以省略)){
};
Block 的类型 :int (^)(int ,int) //就是把变量名去掉后的部分
Block 的变量名:
//定义一个无参数无返回值的 block
//无参数时,小括号不能省去
void (^ sayHi)() = ^void(){
NSLog(@"hellow");
};
sayHi();
//有参数无返回值的block
void (^ sayHi1)(int a) = ^ (int a){//block的定义
NSLog(@"%d",a);
};
sayHi1(5);//block的调用
//定义一个block 实现把数字字符串转化为整数
int (^ exchangeCagrToInt)(NSString *) = ^ int(NSString * array){
int n = [array intValue];
return n;
};
//OC对象作为参数使用
int c = exchangeCagrToInt(@"13");//如果写的是 123ABC 只会打印123 如果是 abc A 之类的就会打印出0,所以以后使用的时候要注意
NSLog(@"%d",c);
//对比C语言的函数指针
//对block 进行重命名(是给block变量类型重名名)
typedef int (^ ValueOfTwo)(int,int);
//ValueOfTwo 指向 返回值为 int 有两个 int 参数的 bloc 类型的 block
ValueOfTwo newBlock = ^(int a ,int b){//此时 newBlock 求两个数的和
return a + b;
};
//注意
int number = 20;
void (^myblock)(int ) = ^(int num){
NSLog(@"%d",num);
NSLog(@"%d",number);
//number 赋新值
//number = number - num;//这里会报错,因为在block内部不能修改局部变量的值,但是可以访问局部变量的值
};
myblock(10);
__block int number = 20;//这样让block内部可以改变我们定义的局部变量
void (^myblock)(int ) = ^(int num){
NSLog(@"%d",num);
NSLog(@"%d",number);
//number 赋新值
number = number - num;//这里不报错,因为在局部变量的值前面加上了修饰符 “__block” 注意是两个下划线哦,但是可以访问局部变量的值
};
myblock(10);
//我们称 ^ 为 托字符
1 // 2 // main.m 9 #import <Foundation/Foundation.h> 10 11 //定义一个求两个数最大值函数 12 int maxValue (int ,int); 13 //函数的实现 14 int maxValue (int a, int b){ 15 return a > b ? a : b; 16 } 17 int main(int argc, const char * argv[]) { 18 @autoreleasepool { 19 // insert code here... 20 NSLog(@"Hello, World!"); 21 //函数指针 (调用可以用 p 或者 maxValue) 22 int (* p)(int,int) = maxValue; 23 int max = p(24, 48); 24 //Block:匿名函数 也是一种函数 只不过是特殊的函数(匿名函数) 25 /* 26 对于Block 的定义: 27 函数的返回值类型 (^ block 变量名)(参数列表)= ^ 返回值类型(可以省略)(参数列标(形参名不可以省略)){ 28 }; 29 */ 30 // int (^ maxOfTwo)(int, int) = ^ int(int a,int b){ 31 // return a > b ? a :b; 32 // }; 33 int (^ maxOfTwo)(int, int) = ^ (int a,int b){ 34 return a > b ? a :b; 35 }; 36 /* 37 Block 的类型 :int (^)(int ,int) //就是把变量名去掉后的部分 38 Block 的变量名: 39 */ 40 int result = maxOfTwo (12,10); 41 NSLog(@"%d",result); 42 int (^ mutil)(int ,int) = ^int (int a,int b){ 43 return a*b; 44 }; 45 int ji = mutil(12 ,4); 46 NSLog(@"%d",ji); 47 //定义一个无参数无返回值的 block 48 //无参数时,小括号不能省去 49 void (^ sayHi)() = ^void(){ 50 NSLog(@"hellow"); 51 }; 52 sayHi(); 53 //有参数无返回值的block 54 void (^ sayHi1)(int a) = ^ (int a){ 55 NSLog(@"%d",a); 56 }; 57 sayHi1(5); 58 //block的定义 59 void (^ printNum)(int a) = ^ void (int a){ 60 NSLog(@"%d",a); 61 }; 62 //block的调用 63 printNum(10); 64 65 66 //定义一个block 实现把数字字符串转化为整数 67 int (^ exchangeCagrToInt)(NSString *) = ^ int(NSString * array){ 68 int n = [array intValue]; 69 return n; 70 }; 71 int c = exchangeCagrToInt(@"13的是否合格"); 72 NSLog(@"%d",c); 73 //对比C语言的函数指针 74 //对block 进行重命名(是给block变量类型重名名) 75 typedef int (^ ValueOfTwo)(int,int); 76 //ValueOfTwo 指向 返回值为 int 有两个 int 参数的 bloc 类型的 block 77 ValueOfTwo newBlock = ^(int a ,int b){ 78 return a + b; 79 };//此时 newBlock 求两个数的和 80 int bb = newBlock(10,12); 81 NSLog(@"%d",bb); 82 ValueOfTwo newMulBlock = ^(int a,int b){ 83 return a*b; 84 }; 85 int bc = newMulBlock(10,12); 86 NSLog(@"%d",bc); 87 88 89 //block访问外面定义的局部变量 90 __block int number = 20; 91 void (^myblock)(int ) = ^(int num){ 92 NSLog(@"%d",num); 93 NSLog(@"%d",number); 94 //number 赋新值 95 number = number - num;//这里不报错,因为在局部变量的值前面加上了修饰符 “__block” 注意是两个下划线哦,但是可以访问局部变量的值 96 97 }; 98 myblock(10); 99 } 100 return 0; 101 }