OC学习之--Block

一 .Block简介

      Block:块语法, 本质上是匿名函数(没有名称的函数)

      标准C里面没有Block,C语言的后期扩展版本,加入了匿名函数。

      C++、JS、Swift等语言,有类似语法,叫做闭包。

       Block语法和函数指针很相似。

    Block语法:如下图

int m = 7;
int (^myBlock)(int) = ^(int num) 
{
    return num * m; 
};

    Block详细

        Block类型:int (^)(int)

        Block变量:myBlock

        Block值:^int (int num){return 7 *num;}        

        即:^返回值类型 (参数列表) {函数体} 其中返回值类型可以省略

二. Block使用

int (^block1)(int, int) = ^(int x, int y) {
    return x + y;
    };
 int a = block1(32, 34);//block的使用和函数指针的使用类似
 NSLog(@"%d", a);
 //打印结果: 66

    Block进行typedef

typedef int (^BlockType) (int x, int y)
//原类型:int (^) (int, int)
//新类型:BlockType
int (^block1)(int, int) = ^(int x, int y) {
    return x + y;
    };
//等价于
BlockType block1 = ^(int x, int y) {

    return x + y;
    };

    Block与局部变量

int main(int argc, const char * argv[])
{
    @autoreleasepool {
    //block内部, 可以使用外界的局部变量
    int num = 1;
    void (^addNum)(void) = ^(void)
    {
        int c = num * 10;
        NSLog(@"%d", c);
     };
     //调用Block
     addNum();
     }
     return 0;
}

    注意:Block内部不能修改局部变量

    int num = 1;
    void (^addNum)(void) = ^(void)
    {
        num ++;//错误:不能修改局部变量
        NSLog(@"%d", num);
     };
     //调用Block
     addNum();
     NSLog(@"%d", num);
     }

    注意:添加__block修饰后可以修改局部变量

    __Block int num = 1;
    void (^addNum)(void) = ^(void)
    {
        num ++;//错误:不能修改局部变量
        NSLog(@"%d", num);
     };
     //调用Block
     addNum();
     NSLog(@"%d", num);
     }

    Block与全局变量

//全局变量
int count = 200;
int main(int argc, const char * argv[])
{
    @autoreleasepool {
    //1.在Block块语法中访问全局变量
    void (^addNum)(void) = ^(void)
    {
        //可以访问到全局变量,并且可以修改全局变量
        count ++;
        NSLog(@"%d", count);
     };
     //调用Block
     addNum();
     //显示结果
     NSLog(@"%d",count);
     }
     return 0;
}

三. Block与数组排序

//Block数组排序
NSArray *stringArray = [NSArray arrayWithObjects:@"abc10", @"abc21", @"abc12",@"abc13", @"abc05", nil];
NSComparator sortBlock = ^(id string1, id string2)
{
    return [string1 compare: string2];
};
NSArray *sortArray = [stringArray sortedArrayUsingComparator:sortBlock];
NSLog(@"%@", sortArray);

    Block对Student对象排序

            students是一个NSMutableArray对象,包含若干个Student对象。按student的age进行排序。

[students sortUsingComparator:^NSComparisonResult(id obj1,id obj2){
        Student *stu1 = (Student *)obj1;
        Student *stu2 = (Student *)obj2;
        if([stu1 age] > [stu2 age]){return NSOrderedDescending;}
        else if([stu1 age] < [stu2 age]){return NSOrderedAscending;}
        else {return NSOrderedSame;}
}];









你可能感兴趣的:(Block定义,Block使用,Block与数组排序)