Block的基本使用、typedef给Block定义别名、Block的应用场景、Block的注意事项

什么是Block?

Block是ios中一种比较特殊的数据类型,是苹果官方特别推荐使用的一种数据类型,应用场景有:动画、多线程、集合遍历、网络请求回调等


Block的作用:用来保存某一段代码,可以在恰当的时间取出来再调用。


Block的基本使用:

//
//  main.m
//  Block的基本使用
//
//  Created by XinYou on 15-5-8.
//  Copyright (c) 2015年 vxinyou. All rights reserved.
//

#import 
    
    
     
     

/**
 *  定义一个没有返回值、没有参数的block
 */
void test_1(){
    
    // 定义block
    void (^helloWorld)() = ^{
        
        NSLog(@"Hello World");
    };
    
    // 执行block
    helloWorld();
}

/**
 定义了一个没有返回值 但有参数的block
 */
void test_2()
{
    // 定义block,该block能打印任意行数的 Hello World
    void (^helloWorld)(int) = ^(int count){
    
        for (int i = 0; i < count; i++) {
            
            NSLog(@"Hello World");
        }
    };
    
    // 执行block
    helloWorld(5);
}

/**
 定义了一个有返回值、有参数的block
 */
void test_3(){

    // 定义block,该block用于求和
    int (^sumBlock) (int, int) = ^(int a, int b){
    
        return a + b;
    };
    
    // 执行block
    int sum = sumBlock(8, 9);
    
    /* 
     
     block还可以这样写:
     
    int (^myBlock) (int, int);
    
    myBlock = ^(int a, int b){
    
        return a -b;
    };
    */
    
    NSLog(@"%d", sum);
}

int main(int argc, const char * argv[])
{

    @autoreleasepool {
        
//        test_1();
        
//        test_2();
        
        test_3();
    }
    return 0;
}


    
    

Block和typedef(给Block定义别名):

//
//  main.m
//  Block和typedef
//
//  Created by XinYou on 15-5-8.
//  Copyright (c) 2015年 vxinyou. All rights reserved.
//

#import 
    
    
     
     

// 使用typedef给基本数据类型取别名
typedef int MyInt;

// 使用typedef给block取别名
typedef int (^MyBlock)(int, int);

int main(int argc, const char * argv[])
{

    @autoreleasepool {
        
        /*
        int (^minusBlock) (int, int) = ^(int a, int b){
        
            return a - b;
        };
        
        int (^multiBlock) (int, int) = ^(int a, int b){
        
            return a * b;
        };
        
        */
        
        // 以上代码跟下面的代码效果一样,但是下面的代码更简洁
        
        MyBlock minusBlock = ^(int a, int b){
            
            return a - b;
        };
        
        MyBlock multiBlock = ^(int a, int b){
            
            return a * b;
        };
        
        
        NSLog(@"%d", minusBlock(10, 7));// 打印结果:3
        
        NSLog(@"%d", multiBlock(8, 7));// 打印结果:56
    }
    return 0;
}


    
    

Block的应用场景:

//
//  main.m
//  Block的应用场景
//
//  Created by XinYou on 15-5-8.
//  Copyright (c) 2015年 vxinyou. All rights reserved.
//

#import 
    
    
     
     

/**
 *  新入职一家公司,模拟前3天要做的事情
 */


/***************************************最原始的做法begin*********************************/
 
// 第一天去上班要做的事情
void doWorkOfFirstDay(){

    NSLog(@"起床、刷牙、穿衣服穿鞋");
    NSLog(@"出门、搭公交");
    NSLog(@"抵达公司");
    
    /********************/
    NSLog(@"了解项目的需求");
    /********************/
    
    NSLog(@"叮咚叮咚 下班了");
    NSLog(@"搭公交");
    NSLog(@"回家");
    NSLog(@"睡觉");
}

// 第二天去上班要做的事情
void doWorkOfSecondDay(){
    
    NSLog(@"起床、刷牙、穿衣服穿鞋");
    NSLog(@"出门、搭公交");
    NSLog(@"抵达公司");
    
    /********************/
    NSLog(@"熟悉公司以前的代码");
    /********************/
    
    NSLog(@"叮咚叮咚 下班了");
    NSLog(@"搭公交");
    NSLog(@"回家");
    NSLog(@"睡觉");
}

// 第三天去上班要做的事情
void doWorkOfThirdDay(){
    
    NSLog(@"起床、刷牙、穿衣服穿鞋");
    NSLog(@"出门、搭公交");
    NSLog(@"抵达公司");
    
    /********************/
    NSLog(@"开始编写代码");
    /********************/
    
    NSLog(@"叮咚叮咚 下班了");
    NSLog(@"搭公交");
    NSLog(@"回家");
    NSLog(@"睡觉");
}

/***************************************最原始的做法end*********************************/


/***************************************改进后的做法begin*********************************/

void workBefore(){

    NSLog(@"起床、刷牙、穿衣服穿鞋");
    NSLog(@"出门、搭公交");
    NSLog(@"抵达公司");
}

void workAfter(){

    NSLog(@"叮咚叮咚 下班了");
    NSLog(@"搭公交");
    NSLog(@"回家");
    NSLog(@"睡觉");
}

// 第一天去上班要做的事情
void doWorkOfFirstDay_1(){
    
    workBefore();
    
    /********************/
    NSLog(@"了解项目的需求");
    /********************/
    
    workAfter();
}

// 第二天去上班要做的事情
void doWorkOfSecondDay_1(){
    
    workBefore();
    
    /********************/
    NSLog(@"熟悉公司以前的代码");
    /********************/
    
    workAfter();
}

// 第三天去上班要做的事情
void doWorkOfThirdDay_1(){
    
    workBefore();
    
    /********************/
    NSLog(@"开始编写代码");
    /********************/
    
    workAfter();
}

/***************************************改进后的做法end*********************************/


/***************************************Block的做法begin*********************************/

void doWorkOfOneDay(void (^work)()){
    
    NSLog(@"起床、刷牙、穿衣服穿鞋");
    NSLog(@"出门、搭公交");
    NSLog(@"抵达公司");
    
    /********************/
    if (work != nil) {// 一定要判空,不然当block为nil,程序会奔溃
        work();
    }
    /********************/
    
    NSLog(@"叮咚叮咚 下班了");
    NSLog(@"搭公交");
    NSLog(@"回家");
    NSLog(@"睡觉");
}

// 第一天去上班要做的事情
void doWorkOfFirstDay_2(){
    
    doWorkOfOneDay(^{
        NSLog(@"了解项目的需求");
    });
}

// 第二天去上班要做的事情
void doWorkOfSecondDay_2(){
    
    doWorkOfOneDay(^{
        NSLog(@"熟悉公司以前的代码");
    });
    
}

// 第三天去上班要做的事情
void doWorkOfThirdDay_3(){
    
    doWorkOfOneDay(^{
        NSLog(@"开始编写代码");
    });
}

/***************************************Block的做法end*********************************/

int main(int argc, const char * argv[])
{

    @autoreleasepool {
        
        doWorkOfFirstDay_2();
        doWorkOfSecondDay_2();
        doWorkOfThirdDay_3();
        
    }
    return 0;
}


    
    

Block的注意事项:

//
//  main.m
//  Block使用注意
//
//  Created by XinYou on 15-5-8.
//  Copyright (c) 2015年 vxinyou. All rights reserved.
//

#import 
    
    
     
     

typedef void (^MyBlock) ();

int main(int argc, const char * argv[])
{

    @autoreleasepool {
        
        int a = 10;
        
        __block int b = 10;
        
        MyBlock block = ^{
        
            // 下面这行会报错,默认情况下,block内部不能修改外部的局部变量
//            a = 20;
            
            // 下面这行是正确的,被__block修饰的局部变量,可以在block内部修改
            b = 20;
            
            NSLog(@"a = %d", a);// 虽然不能修改,但是可以访问
            
            NSLog(@"b = %d", b);
        };
        
        block();
        
    }
    return 0;
}


    
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值