iOS开发基础block的形式讲解

原创 2016年08月30日 10:00:11

前几个星期,我利用通知写了一个仿京东选择地址的Demo(http://blog.csdn.net/hbblzjy/article/details/52212879),后来看过一篇文章说,尽量少用通知,因为通知容易占据手机内存,即使你进行了通知移除处理,也不太保险,所以今天再次谈谈Block的使用,之前也写过一篇文章(http://blog.csdn.net/hbblzjy/article/details/51108159)。

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

  1. 声明一个Block,并调用它。
  2. 声明一个Block型的属性。
  3. 声明一个方法,接受一个Block型的参数,并写出调用时传入的Block实参。
  4. 实现一个Block的递归调用(Block调用自己)。
  5. 实现一个方法,将Block作为返回值。

一、概念

首先需要了解的是Block是一个代码块,是一个变量的形式存在的。

二、构成了解

我们需要在函数中声明block,因为是变量的形式,而且存在静态变量形式

类型1:

 NSString* (^blocks)(NSString*)= ^(NSString *str)

    {

        //NSLog(@"this is :%@",str);

        return str;

    };

返回值类型是字符串,如同函数一样,返回值类型写在最前面

^blocks是声明一个代码块,名字叫做blocks

后面括号跟的是参数的类型,如果没有参数返回void,如果有多个参数类型,那么逗号分隔列出

等于号后面的是参数名列表。

因为写的是一个有返回值的block,所以需要return一个与返回值类型相同类型的值,这里返回的是参数字符串

类型2:

int (^david)(int)= ^(int num)

    {

        return num*5;

    };

这里的返回值类型是一个int,代码块名字叫做david,参数是一个int类型的变量

等于号后面是参数列表,执行的语句是return num *5这句话。

因为如上的两个例子都是有返回值的类型,那么我在调用的时候可以直接使用。

例如:

    NSLog(@"this is block:%@",blocks(@"hello"));

    NSLog(@"this is block:%d",blocks(5));

类型3:

void (^david)(void)= ^(void)

    {

            NSLog(@"I am a block code!");

    };

这里只是简单的执行了一句话,调用方法就是直接打印或者当作变量直接使用,形式介绍:

  • 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
{
    // ...
}

还有很多可参考的文章:

参考:

http://blog.csdn.net/fhbystudy/article/details/17350951

http://stackoverflow.com/questions/10892361/generic-typeof-for-weak-self-references

http://stackoverflow.com/questions/14877415/difference-between-typeof-typeof-and-typeof-objective-c

http://rocry.com/2012/12/18/objective-c-type-of/

http://fuckingblocksyntax.com/ 这是个工具网站,写block的时候会用到。

http://www.jianshu.com/p/dc5ced9bd7e7


版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hbblzjy/article/details/52366604

Objective-C的Block,递归与泛型

Apple在C,Objective-C和C++中扩充了Block这种文法的,并且在GCC4.2中进行了支持。现在我们可以在Mac 10.6和iOS 4中使用。如果是Mac 10.6 或 iOS 4.0...
  • ArthurChenJS
  • ArthurChenJS
  • 2011-07-19 15:53:55
  • 7203

Objective-C Block语法递归函数实现

两种方法可以实现,一种是参考zenny_chen所说的全局的或都static的block可以实现 http://www.cocoachina.com/bbs/read.php?tid-9222-fp...
  • aluoshuai
  • aluoshuai
  • 2012-09-04 16:46:54
  • 1701

block的几种存在形式及其使用

接口文件: 实现文件: 测试文件:
  • jiuchabaikaishui
  • jiuchabaikaishui
  • 2014-10-09 21:21:23
  • 802

一篇文章看懂iOS代码块Block

iOS代码块Block是苹果在iOS4开始引入的对C语言的扩展,用来实现匿名函数的特性,Block是一种特殊的数据类型,其可以正常定义变量、作为参数、作为返回值,特殊地,Block还可以保存一段代码,...
  • wenxiangjiang
  • wenxiangjiang
  • 2016-05-12 21:13:53
  • 9807

玩转 IOS 开发 - block 使用详解

Block 是iOS在4.0之后新增的程式语法,在iOS SDK 4.0之后,block应用几乎无处不在。在其他语言中也有类似的概念称做闭包(closure),比如object C的好兄弟swift ...
  • liulanghk
  • liulanghk
  • 2015-06-05 23:07:33
  • 17839

iOS中block作为一个函数的参数

我们首先设想有如下的一个头文件: @interface ViewController : UIViewController {     AAA *aaa; } 假设在这个V...
  • u010132419
  • u010132419
  • 2013-06-21 14:46:46
  • 7663

ios开发中block使用小结

一、block基本使用   声明:返回值(^block变量名)(参数)   定义 :三种形式   二、block保存一段代码       在某处在block内声明一段代码,在另一处调...
  • denggun12345
  • denggun12345
  • 2017-01-24 10:36:28
  • 502

iOS中block块的存储位置&内存管理

从block存储位置说明为什么要这样修饰block,从而为何会有循环引用问题,以及如何解决它...
  • Cloudox_
  • Cloudox_
  • 2017-04-13 14:24:35
  • 2081

11、iOS开发详解(基础知识)

iOS开发详解本章节针对如何开发基于iOS系统的插件进行介绍
  • zzh_receive
  • zzh_receive
  • 2016-11-17 21:08:48
  • 2371

3种类型的block

根据isa指针,block一共有3种类型的block _NSConcreteGlobalBlock 全局静态 _NSConcreteStackBlock 保存在栈中,出函数作用域就销毁 _NSC...
  • hou_manager
  • hou_manager
  • 2018-02-26 14:01:13
  • 82
收藏助手
不良信息举报
您举报文章:iOS开发基础block的形式讲解
举报原因:
原因补充:

(最多只允许输入30个字)