• Object-c block块


    block块

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

    块对象的定义

    	^(参数列){主体}
    

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

    块对象的实例和生命周期

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

    #include <stdio.h>
    #include <Block.h>
    
    void pr(int (^block)(void))
    {
       printf("%d
    ",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;
    }
    

    这是输出的结果

    很明显发现最后的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. 块句法写在函数内时,和自动变量一样,块对象的内存区域会在执行包含块对象的函数时被保存在栈上。该区域的声明周期就是在函数运行期间。
  • 相关阅读:
    Ext js-02 -官方API文档使用
    [Python3网络爬虫开发实战] 1.1-Python3的安装
    什么是关系型数据库?
    htaccess分布式配置文件常用写法
    PHP无限极分类
    svn在linux上的安装
    优化Web中的性能
    Python 面向对象(初级篇)
    文本日期提取
    HMM分词实例
  • 原文地址:https://www.cnblogs.com/evansyang/p/5258095.html
Copyright © 2020-2023  润新知