博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Object-c block块
阅读量:5137 次
发布时间:2019-06-13

本文共 1194 字,大约阅读时间需要 3 分钟。

block块

块对象(block Object)是在Mac OS X10.6和iOS 4.0平台下可以使用的功能,它不是Object-c而是C语言的功能的实现。Apple的文档中将其称为块对象或Block(复数为Blocks),在其他编程语言中,它与闭包(closure)功能基本相同。

块对象的定义

^(参数列){主体}

这里从“^”开始到参数列,主体最后的大括号,这一段记述称为块对象的块句法(block literal)。实际上,块句法并不是被用于在内存中分配的块对象,它只是编写代码时的一种表达用语。

块对象的实例和生命周期

下面是我看到的一个很有趣的例子

#include 
#include
void pr(int (^block)(void)){ printf("%d\n",block());}int (^g)(void)=^{return 100;};void func1(int n){ int (^b1)(void)=^{return n;}; pr(b1); g=b1;}void func2(int n){ int a=10; int (^b2)(void)=^{return n*a;}; pr(b2);}int main(int argc, const char * argv[]){ pr(g); func1(5); func2(5); pr(g); return 0;}

这是输出的结果

733621-20160309143517913-380530357.png

很明显发现最后的pr(g)输出的结果不对

这是因为在func1中将变量b1的块赋值给了外部变量g。但是变量b1中保存的是指向栈的指针。函数func1执行完之后,该块的生命周期也随之结束。由于函数func2的调用会使得栈上被写入其他信息,因此在执行的时候最后pr(g)出错了。

如何修改

将func1中的g=b1;修改为g=Block_copy(b1);,当然要加上头文件 Block.h

Block_copy(block):参数为栈上的块对象,返回堆上复制的块对象。否则(参数为静态数据区或未堆上的块对象)则不进行复制而直接将参数返回,但会增加参数的块对象的引用次数

与之对应的有

Block_release(blcok):减少参数的块的引用计数,减到0时释放块对象的内存区域

对块句法生命周期的总结

  1. 块句法写在函数外面时,只在静态数据区分配一片内存区域给块对象。这片区域在程序执行期会一直存在。
  2. 块句法写在函数内时,和自动变量一样,块对象的内存区域会在执行包含块对象的函数时被保存在栈上。该区域的声明周期就是在函数运行期间。

转载于:https://www.cnblogs.com/evansyang/p/5258095.html

你可能感兴趣的文章
利用IP地址查询接口来查询IP归属地
查看>>
HTML元素定义 ID,Class,Style的优先级
查看>>
构造者模式
查看>>
http和https的区别
查看>>
Hbuild在线云ios打包失败,提示BuildConfigure Failed 31013 App Store 图标 未找到 解决方法...
查看>>
找到树中指定id的所有父节点
查看>>
4----COM:a Generative Model for group recommendation(组推荐的一种生成模型)
查看>>
UVA 11137 - Ingenuous Cubrency
查看>>
js阻止事件冒泡的两种方法
查看>>
Java异常抛出
查看>>
74HC164应用
查看>>
变量声明和定义的关系
查看>>
Wpf 之Canvas介绍
查看>>
linux history
查看>>
jQuery on(),live(),trigger()
查看>>
Python2.7 urlparse
查看>>
sencha touch在华为emotion ui 2.0自带浏览器中圆角溢出的bug
查看>>
【架构】Linux的架构(architecture)
查看>>
ASM 图解
查看>>
Date Picker控件:
查看>>