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();