Block 我的理解

来源:互联网 发布:淘宝双十一红包不中 编辑:程序博客网 时间:2024/05/18 02:39

1.块

Block(块)是iOS4.0新增的一种C语言特性。 块 是匿名函数,可接受参数以及返回值,执行时能够捕获运行时状态。另外,块实际上是 Objective-C对象,因此可以作为参数传递,可存储在Foundation数组,字典和集合中,可使用手动管理内存或者ARC。最后,块 可修改当前词法作用域内的对象。
实际上,块被广泛用于替代委托和技术处理程序(completion handler):不必提供指定委托的属性,添加协议定义,实现协议方法并设计将状态变量传递给委托方法的机制,而在块中实现委托逻辑。

2.声明和使用块

//Block声明:@property (strong,nonatomic)NSString * (^repeatString)(int,NSString *);//Block实现:self.repeatString=^NSString * (int numTimes,NSString * repeat){        NSMutableString * retString =[[NSMutableString alloc]init];        for (int i=0; i<numTimes; i++) {            [retString appendString:repeat];        }        return [NSStringstringWithString:retString];    };    NSString * repeatTest =self.repeatString(5,@" ok ");    NSLog(@"%@",repeatTest);//输出结果:  ok  ok  ok  ok  ok 

3.使用块捕获状态

NSString * bloctStr =@" BlockTest ";self.repeatString = ^NSString * (int numTimes){   NSMutableString * retString =[[NSMutableStringalloc]init];   for (int i=0; i<numTimes; i++) {            [retString appendString:bloctStr];}   return retString;};    bloctStr=@"BlockTest Change";    NSString * repeatTest =self.repeatString(3);    NSLog(@"%@",repeatTest);//输出结果:  BlockTest  BlockTest  BlockTest

要让这个块能够使用这个变量的最新值或直接修改这个变量的值,可在声明这个变量时,使用限定符__block,这表明块,可以直接访问这个变量,而不是在块赋值时捕获这个变量的值。

@property (strong,nonatomic)void (^repeatString)(int);__block NSString * bloctStr =@" BlockTest ";self.repeatString=^(int numTimes){        NSMutableString * retString =[[NSMutableStringalloc]init];        for (int i=0; i<numTimes; i++) {            [retString appendString:bloctStr];        }        bloctStr=retString;    };    bloctStr=@"BlockChange ";    self.repeatString(3);    NSLog(@"%@",bloctStr);//输出结果: BlockChange BlockChange BlockChange 

4.将 块 用作方法参数

一种常见的情形是,将块用作长时间运行的任务或异步任务的结束处理程序。为此,必须首先声明一个将结束块作为参数的方法。

- (void)viewDidLoad {    [superviewDidLoad];    [self.longRuningTaskWithCompletionHandler:^{        NSLog(@"KTBlock !");    }];}-(void)longRuningTaskWithCompletionHandler:(void(^)(void))completionBlock{//void(^)(void) 是参数(block)类型    if (completionBlock) {        completionBlock();    }};

5.内存,线程和块
未完待续。。。

0 0
原创粉丝点击