iOS开发语法篇block详解

摘要:
};//*整个block体作为参数传入时,往往没有参数,只是进行延迟运算作用,因为定义了block内容如果是暂时左值不需要的话,block是不执行的。

一:基本定义

iOS开发语法篇block详解第1张

/*初步上式block定义的一些理解和解释,接下来会详解:

*block名为myBlock,结合C的函数指针,myBlock为block体的指针,指向block体的入口地址

*int result = myBlock(5) <==> ^(int num){return num*num}(5)//将5传给num

*回调时可以将myBlock作为参数传入,也可以直接传入block体^(int num){…};//

*整个block体作为参数传入时,往往没有参数,只是进行延迟运算作用,因为定义了block内容

如果是暂时左值不需要的话,block是不执行的。

例:[request setFailedBlock:^{NSError *error = [request error]; };];

//如果不执行setFailedBlock方法时,后面的block是不执行的,只是静静地待在堆中,原理接下来会说到。

*/

二:block原理

首先介绍基本的block,将OC语言block改写成C语言的block

具体步骤:

iOS开发语法篇block详解第2张

iOS开发语法篇block详解第3张

我们通过IMP定义可以看出:

在main()函数中,block的返回值为(void(*)()),其实就是一个函数指针,所在在这种情况下,block就可以看做是匿名函数的函数指针来对待。

三:关键字__block

主要作用:1.block对外部变量是只读的,要变成可读可写,就需要加上__block

2.将栈中的block复制到堆上一份,从而避免了循环引用这个情况

iOS开发语法篇block详解第4张

将带有__block关键字的block进行OC->C语言转换:

iOS开发语法篇block详解第5张

四:存储类型

block的存储形态有三种:_NSConcretStackBlock(栈)、_NSConcretGlobalBlock(全局)、_NSConcretMallocBlock(堆)

要点一:当block在函数内部,且定义的时候就使用了函数内部的变量,那么这个 block是存储在栈上的。

要点二:当block定义在函数体外面,或者定义在函数体内部且当时函数执行的时候,block体中并没有需要使用函数内部的局部变量时,也就是block在函数执行的时候只是静静地待在一边定义了一下而不使用函数体的内容,那么block将会被编译器存储为全局block。

要点三:全局block存储在堆中,对全局block使用copy操作会返回原函数指针;而对栈中的block使用copy操作,会产生两个不同的block地址,也就是两个匿名函数的入口地址。

要点四:ARC机制优化会将stack的block,转为heap的block进行调用。

iOS开发语法篇block详解第6张

以下存储类题目摘自cocoaChina论坛:

iOS开发语法篇block详解第7张

免责声明:文章转载自《iOS开发语法篇block详解》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇C#MD5算法字符串、对象、数组操作方法、json方法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

ios开发学习文字视图(Text)效果源码分享系列教程

Swipe Shift Caret介绍: 在UITextView或者UITextField中插入文字的时候,用手指滑动屏幕左右两边任意位置,都可以左右调整文字输入光标(caret)。在选择文字范围时,用手指左右滑动屏幕,都可以调整选择的左右范围,而不需要用手指拖动范围选择的两根竖线(caret)。http://ios.itmdc.com/thread-36...

iOS开发UI篇—iPad和iPhone开发的比较

一、iPad简介 1.什么是iPad   一款苹果公司于2010年发布的平板电脑   定位介于苹果的智能手机iPhone和笔记本电脑产品之间   跟iPhone一样,搭载的是iOS操作系统    2.iPad的市场情况   截止至2013年10月23日,iPad已经累计销售1.7亿台   在平板市场的占有率高达81% 二、关于iphone和iPad 说明:...

iOS开发UI篇—iOS开发中Xcode的一些使用技巧

一、快捷键的使用 经常用到的快捷键如下: 新建 shift + cmd + n 新建项目 cmd + n 新建文件 视图 option + cmd + 回车 打开助理编辑器 cmd + 回车 显示主窗口 cmd +0 导航窗口 option + cmd +0 工具窗口 在.m & .h之间切换 control + cmd + 上/下 按照浏览文件的...

用HTML5/CSS3/JS开发Android/IOS应用

现在人人都想成为安卓/IOS应用开发工程师。其实,安卓/IOS应用可以用很多种语言来实现。由于我们前端开发工程师,对HTML5/CSS/JavaScript的网络编程已经相当熟悉了。所以,今天大家将会认识到一些利用前端语言来开发安卓/IOS应用的工具。  在文章的末尾,也介绍了使用JAVA、C#、Lua以及AS3来开发安卓应用的工具。  希望大家都能找到适...

iOS开发 贝塞尔曲线UIBezierPath(后记)

使用CAShapeLayer与UIBezierPath可以实现不在view的drawRect方法中就画出一些想要的图形 。 1:UIBezierPath: UIBezierPath是在 UIKit 中的一个类,继承于NSObject,可以创建基于矢量的路径.此类是Core Graphics框架关于path的一个OC封装。使用此类可以定义常见的圆形、多边形等...

ios开发——日常之XCode 文件后面带有问号的问题怎么解决??

ios开发——日常之XCode 文件后面带有问号的问题怎么解决??(转自zzzzzdddddxxxxxCsdn) 在使用xcode的过程中,免不了要把文件通过拖放到目录树的方式引入并导入文件,下面讲一下各种细节: 1. 导入步骤: 把文件拖入目录树中目标目录,在弹出的悬浮框中勾选 copy if needed ,create groups ,add...