Block(简单介绍)

 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 }
原文地址:https://www.cnblogs.com/DevinSMR/p/5218142.html