天天看点

iOS block的简单例子

iOS block的简单例子

附有源代码

代码背景:需要将一个总秒数转换成00:00:00这种格式的字符串。

block的使用分为几种情况:

一:无参数,主动调用block

NSString*(^CalcTimeWithSeconds)(void) = ^(void)

{

    int hour,min,sec,num=12345;

    sec = num%60;  //剩下的秒数

    min = num/60;  //总分钟数

    hour = min/60;  //总小时数

    min = min%60;  //计算了总小时数之后剩下的分钟数

    NSString * strTime = [NSString stringWithFormat:@"time str:%02d:%02d:%02d",hour,min,sec];

    //[strTime description];

    NSLog(strTime);

    return strTime;

};

NSString *str = CalcTimeWithSeconds();

二:有参数,主动调用block

NSString*(^CalcTimeWithSeconds)(int) = ^(int num)

{

    int hour,min,sec;

    sec = num%60;  //剩下的秒数

    min = num/60;  //总分钟数

    hour = min/60;  //总小时数

    min = min%60;  //计算了总小时数之后剩下的分钟数

    NSString * strTime = [NSString stringWithFormat:@"time str:%02d:%02d:%02d",hour,min,sec];

    //[strTime description];

    NSLog(strTime);

    return strTime;

};

NSString *str = CalcTimeWithSeconds(12345);

三:有(无)参数,block被调用

四:block访问局部变量

block可以访问局部变量,但要注意,系统在定义块的时候就会把局部变量的值保存到块中。

注意:这里的访问是只读。如果对局部变量赋值的话就会出错,why?

如果不希望在定义块的时候就把局部变量的值复制到块中,而是等到执行时才去访问、获取局部变量的值,甚至希望块也可以改变局部变量的值,此时可以考虑使用__block来修饰局部变量。

       int onlyPrintIt = 123;

    __block int num = 1;

    __block char buf = 'a';

    __block NSString* string = @"string";

    __block NSMutableArray* arr = [NSMutableArray arrayWithObjects:@"ele1",nil];

    void (^testBlock)(void)=^(void)

    {

        //onlyPrintIt = 456;//报错。

        NSLog(@"%d",onlyPrintIt);

        num = 2;  //可以赋值来修改局部变量,但是需要__block修饰符

        buf = 'b';

        string = @"change";

        [arr addObject:@"ele2"];

        NSLog(@"%d,%c,%@,%@",num,buf,string,arr);

    };

    testBlock();