1 #import "ViewController.h" 2 3 int age = 18; 4 typedef int(^MaxBlock)(int,int); 5 @interface ViewController () 6 7 @end 8 9 @implementation ViewController 10 11 - (void)viewDidLoad { 12 [super viewDidLoad]; 13 // Do any additional setup after loading the view, typically from a nib. 14 #pragma mark - Block的定义 15 //block的实质是匿名函数 16 //block的定义分为三个部分:1.返回值类型 2.参数列表 3block的实体部分{} 17 /* 18 ^返回值类型(参数列表:参数类型,参数名){ 19 如果有返回值,使用return 返回值 20 }; 21 */ 22 23 //定义一个简单的block实现输出一句话 24 // ^void(){ 25 // NSLog(@"今天你吃饭了吗?"); 26 // 27 // }; 28 // //定义一个简单的block返回两个整数的和 29 // ^int(int a, int b){ 30 // return a + b; 31 // }; 32 // //定义一个block返回两个数的最大值 33 // ^int(int x, int y){ 34 // return x > y ? x : y; 35 // }; 36 37 #pragma mark - block的使用 38 39 //Block的实质是匿名函数,不能像函数一样调用函数名,故引入了Block变量 40 //定义的Block变量必须和Block的定义部分返回值类型保持一致 41 // void(^SayHi)() = ^void(){ 42 // NSLog(@"今天你吃饭了吗?"); 43 // }; 44 // SayHi(); 45 // 46 // int(^Sum)(int,int) = ^int(int x, int y){ 47 // return x + y; 48 // }; 49 // NSLog(@"%d",Sum(3,5)); 50 // 51 // int(^MaxValue)(int, int) = ^int(int x, int y){ 52 // return x > y ? x : y; 53 // }; 54 // NSLog(@"%d",MaxValue(2,9)); 55 56 //Block的定义部分可以省略返回值,如果没有参数的情况下()可以省略 57 58 #pragma mark - Block的重定义typedef 59 // MaxBlock max = ^int(int x, int y){ 60 // return x > y ? x : y; 61 // }; 62 // NSLog(@"%d",max(3,8)); 63 #pragma makr - Block与变量 64 //2.Block与在Block块外部定义的局部变量之间的关系:在Block块中可以访问该局部变量,但是不能修改 65 int count = 8; 66 67 //3.Block与使用__block修饰的局部变量之间的关系:可以修改可以访问 68 __block int num = 5; 69 70 //4.Block与static修饰的静态变量之间的关系:可以访问可以修改 71 static int number = 50; 72 //5.Block与全局变量之间的关系:可以访问和修改; 73 MaxBlock max = ^(int x, int y){ 74 75 //1.Block与其内部的参数局部变量之间的关系:在Block内部可以修改和访问这些局部变量 76 return x > y ? x : y; 77 NSLog(@"%d",count); 78 }; 79 80 #pragma mark - Block的内存 81 82 /* 83 在 Objective-C 语言中,一共有 3 种类型的 block: 84 85 _NSConcreteGlobalBlock 全局的静态 block,不会访问任何外部变量。 86 _NSConcreteStackBlock 保存在栈中的 block,当函数返回时会被销毁。 87 _NSConcreteMallocBlock 保存在堆中的 block,当引用计数为 0 时会被销毁。 88 */ 89 //在Block块中没有使用任何变量:此时的Block存储在全局区 90 void(^block)() = ^{ 91 92 }; 93 //打印block在哪个区 94 NSLog(@"block = %@",block); 95 //Block块中有__block修饰的变量的时候此时存储在堆区 96 97 98 }
时间: 2024-11-05 13:47:13