ios block

一种新的数据类型,用于定义变量
Block类型的变量中存储的数据是一段程序代码

1. 语法
void/*返回值类型*/(^myBlock/*名字*/)(void/*形参*/) = ^void(void)/*与前面一一对应*/{
    NSLog(@"Block被执行了")
double (^myBlock1)(int,int/*可以直接只写数据类型*/) = ^double(int a,int b/*需要写上形参名*/){
    return a+b;
}
};

(左右相等)
typedef void(^BlockType)(void);//定义了一个Block的数据类型
typedef double(^myBlock2)(int,int);
2. Block与全局变量
//Block与全局变量
        myBlock2 b3 = ^double(int a,int b){
            a *= g_i;//全局变量可以被访问
            g_i = 20;//全局变量可以被赋值
            return a+b;
        };
        NSLog(@"%lg",b3(2,3));
        NSLog(@"%d",g_i);
3. Block与局部变量
 //Block与局部变量
        int i2 = 30;
        __block int i3 = 50;
        BlockType b4 = ^void(void){
            NSLog(@"%d",i2);//局部变量可以在Block中被访问
//            i2= 40;//局部变量不能在Block中被赋值
            i3 = 60;//加上关键字__block后,局部变量可以在Block中被赋值
        };
        b4();
        NSLog(@"%d",i3);
4.Block在自定义类中的使用
//Block在自定义类中的使用
        TRMyClass *myC = [[TRMyClass alloc]init];
        [myC method];
        
        [myC method:^void(void){
            NSLog(@"无话可说");
        }];
        
        [myC method:^void(void){
            NSLog(@"有话说");
        }];
        
        [myC method2:^double(int a,int b){
            return a+b;
        }];
        [myC method2:^double(int a,int b){
            return a*b;
        }];
        
        [myC method3:^double(int a,int b){//既传算法又传数据的Block
            return a+b;
        }withX:10 andY:20];
        [myC getBlock]();
        
        myC.b = ^void(void){
            NSLog(@"Block做类的属性");
        };

        myC.b();
5. Block与数组
 //Block与数组的关系
        NSNumber *a1 = [NSNumber numberWithInt:10];
        NSNumber *a2 = [NSNumber numberWithInt:8];
        NSNumber *a3 = [NSNumber numberWithInt:20];
        NSNumber *a4 = [NSNumber numberWithInt:2];
        NSNumber *a5 = [NSNumber numberWithInt:15];
        
        NSArray *num = @[a1,a2,a3,a4,a5];
        NSArray *sorted = [num sortedArrayUsingComparator:^NSComparisonResult(id obj1,id obj2){
            return [obj1 compare:obj2];//从小到大排序
        }];
        NSLog(@"%@",sorted);
        
        NSArray *str = @[@"one",@"two",@"three"];
        sorted = [str sortedArrayUsingComparator:^NSComparisonResult(id obj1,id obj2){
            return [obj1 compare:obj2];//按字母的大小顺序排序
        }];
        NSLog(@"%@",sorted);
6. Block与字典
   //Block与字典
        NSDictionary *dic1 = @{@"1":a1,@"2":a2,@"3":a3,@"4":a4,@"5":a5};
        sorted = [dic1 keysSortedByValueUsingComparator:^NSComparisonResult(id obj1 ,id obj2){
            return [obj1 compare:obj2];//从小到大排序
        }];
        for (NSString *key in sorted){
            NSLog(@"%@ = %@",key,dic1[key]);
        }
        NSLog(@"---------------");
        NSDictionary *dic2 = @{@"1":@"one",@"2":@"two",@"3":@"three",@"4":@"four",@"5":@"five"};
        sorted = [dic2 keysSortedByValueUsingComparator:^NSComparisonResult(id obj1, id obj2) {
            return [obj1 compare:obj2];//按字母的大小顺序排序
        }];
        for (NSString *key in sorted){
            NSLog(@"%@ = %@",key,dic2[key]);
        }
7、Block 和 函数指针 的本质区别
  fun();
     //Block 和 函数指针 的本质区别
     myBlock();//所指向的代码是没有名字的
//        void (*pf)() = fun;//函数指针,但是指向的代码要有名字
//        pf();
     NSLog(@"%lg",myBlock1(2,3));
成功的三大原则: 1、坚持 2、不要脸 3、坚持不要脸
原文地址:https://www.cnblogs.com/xulinmei/p/7420104.html