iOS 开发之Block

作者: 残夜孤鸥 | 来源:发表于2017-09-11 16:56 被阅读22次

ios4.0之后,block横空出世,它本身封装了一段代码并将这段代码当做变量,通过block()的方式进行回调.类似于C函数中,定义一个指向函数的指针并调用:

bool executeSomeTask(void) {
    // do something and return if success or not
}
bool (*taskPoint)(void);
taskPoint = something;

上面的函数指针可以直接通过(*taskPoint)()方式调用executeSomeTask这个函数, 这样对比block似乎跟C语言的函数指针是一样的, 但是两者仍然存在差别:

1. block的代码是内联的, 效率高于函数调用;
2. block对于外部变量默认是只读属性,要变成可读可写,就需要加上__block,或者将栈中的block复制到堆上一份,从而避免了循环引用这个情况;
3. block被Objective-C看成是对象处理

下面,我们一起来认识一下神秘的Block:
首先了解洗block的三种存储形态:
_NSConcretStackBlock(栈),_NSConcretGlobalBlock(全局),_NSConcretMallocBlock(堆)

要点一: 当block在函数内部, 且定义的时候就使用了函数内部的变量, 那么这个block是存储在栈上的.
要点二: 1.当block定义在函数体外面, 2.定义在函数体内部,但当时函数执行的时候,block体中并没有需要使用函数内部的局部变量, 也就是block在函数执行的时候只是静静地待在一边定义了一下而不使用函数体的内容, 那么block将会被编译器存储为全局block.
要点三: 全局block储存在堆中, 对全局block使用copy操作会返回原函数指针;而对栈中的block使用copy操作,会产生两个不同的block地址, 也就是了两个匿名函数的入口地址.
要点四: ARC机制优化会将stack的block, 转为heap的block进行调用.

Block的基本定义:

int (^myBlock)(int a, int b) = ^(int a, int b){ return a*b};
第一个int 为返回值类型,如果没有返回值则用void
myBlock 为block 的名字
第二个int 为参数类型
等号前面为block的声明,等号后面为block的实现
int a, int b 为block传入的形参
大括号内部为block体
block是代码块,所以需要用;符号
如果暂时等号左边的值不需要的话,block是不执行的

按照这种声明方式未免麻烦了些,别担心,苹果早已为我们准备好了一切

typedef void(^DownloadBlock)(NSData *success);
就是这么简单,然后可以自救写一个属性方便调用,或者嵌在函数里,或者直接调用

总结:block捕获变量,代码传递,代码内联等特性赋予了它多于代理机制的功能和灵活性,尽管它也存在循环引用,不易调试追溯等缺陷,但是无疑它深受开发者的喜爱.

相关文章

  • iOS开发-由浅至深学习block

    iOS开发-由浅至深学习block iOS开发-由浅至深学习block

  • iOS开发基础:开发两年的你也不会写的Block

    iOS开发基础:开发两年的你也不会写的Block iOS开发基础:开发两年的你也不会写的Block

  • iOS开发之Block

    1.block是ios中的一种比较特殊的数据类型,可参考C语言的函数指针 是用来保存一段代码,可以在恰当的时间在取...

  • iOS开发之Block

    1.OC中 2.Swift中 3.案例一block回调 UMengShareManage调用testFunctio...

  • iOS 开发之Block

    ios4.0之后,block横空出世,它本身封装了一段代码并将这段代码当做变量,通过block()的方式进行回调....

  • iOS开发之Block

    前言 block是一个从iOS4后开始引入的代码块语法,能够代替代理来实现反向传值。接下来我将从以下几个方面介绍b...

  • iOS开发之Block

    Block是啥? Block又称作匿名函数,是苹果引入的,在C、C++、Objective-C下均可使用。其他的一...

  • iOS开发之Block

    block的本质 block本质上也是一个OC对象,它内部也有个isa指针。 block是封装了函数调用以及函数调...

  • iOS进阶之Block的本质及原理

    iOS进阶之Block的本质及原理 前言 相信稍微有点开发经验的开发者,应该都对block有一定的了解。刚开始使用...

  • block引用变量造成循环引用解决方案

    参考文章:[ iOS之Block报错:capturing self strongly in this block ...

网友评论

    本文标题:iOS 开发之Block

    本文链接:https://www.haomeiwen.com/subject/daixsxtx.html