blcok基础

来源:互联网 发布:cn域名个人备案 编辑:程序博客网 时间:2024/05/16 14:00

作者:溪石
原文链接:http://www.jianshu.com/p/dc5ced9bd7e7


阅读本文之前,请尝试写出一下问题:


  1. 声明一个Block,并调用它。

  2. 声明一个Block型的属性。

  3. 声明一个方法,接受一个Block型的参数,并写出调用时传入的Block实参。

  4. 实现一个Block的递归调用(Block调用自己)。

  5. 实现一个方法,将Block作为返回值。


现在拿出笔纸,放下手机,20分钟后见...




欢迎回来!如果你未能写出以上问题的答案,本文将给你答案。


本文使用以下符号,含义列举如下


  • return_type 表示返回的对象/关键字等(通常是void)

  • blockName 表示block的名称

  • var_type 表示参数的类型

  • varName 表示参数名称


声明一个Block,作为局部变量

return_type (^blockName)(var_type) = ^return_type (var_type varName) {    // ...};blockName(var);


声明一个Block型的属性


注意与局部变量的声明比较,有细微差别,你能指出吗?

@property (copy) return_type (^blockName) (var_type);


在定义方法时,声明Block型的形参


这里提供的是Block的定义

- (void)yourMethod:(return_type (^)(var_type))blockName;


Block作为实参


调用方法时,传入Block,这里需要的是Block的具体实现

[someObject doSomethingWithBlock: ^return_type (var_type varName){    //...}];


如果已经定义了局部变量的Block,也可以直接传入名称。


匿名Block


Block实现时,如上文的局部变量和实参,等号右边就是一个匿名Block,它没有blockName:

^return_type (var_type varName){    //...};


typedef Block


利用typedef简化Block的声明:

typedef return_type (^BlockTypeName)(var_type);


然后可用BlockTypeName定义Block,类似类名的使用方法:

BlockTypeName aBlock = ^return_type (var_type) {    //...}


内联 Block


这种形式并不常用,匿名Block声明后立即被调用:

^return_type (var_type varName){    //...}(var);


内联 Block可用于代码分块,提高代码可读性,功能类似大括号的代码块,其它功能非常有限:

{   //...}


递归调用Block


Block内部调用自身,递归调用是很多算法基础,特别是在无法提前预知循环终止条件的情况下。注意 由于Block内部引用了自身,这里必须使用__block避免保留环问题。

__block return_type (^blockName)(var_type) = [^return_type (var_type varName){    if (returnCondition)    {        blockName = nil;        return;    }    // ...    blockName(varName);} copy];blockName(varValue);


Block作为返回值


方法的返回值是一个Block,可用于一些“工厂模式”的方法中:

- (return_type(^)(var_type))methodName{    // ...}

0 0
原创粉丝点击