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 }