• Block


    一、前言
         block是iOS4.0+和Mac oxX 10.6以后引进的对C语言的拓展,用来实现匿名函数的特性。所谓匿名函数,也成闭包函数,即允许创建一个临时的没有指定名称的函数。最经常作回调函数(callback)参数的值,也有其他用法,比如作为一个变量值来使用。
    二、基础知识
         1、再iOS中,使用脱字符”^”来声明一个block变量,block的内容包含在{}中,并且和C语言一样用“;”来表示语句的结束。具体定义如下图:
    如果没有参数则参数名num可以省略。
     
         2、定义一个简单的没有返回值,没有参数的block,如下:
    - (void)viewDidLoad {
        [super viewDidLoad];
       
        //block
        void(^myBlock)(void)  = ^(void) {
            NSLog(@"This is a block without parameter and returned value");
        };
        myBlock();
    }
    也可以直接写成:
    - (void)viewDidLoad {
        [super viewDidLoad];
       
        //block
        void(^myBlock)(void)  = ^ {
            NSLog(@"This is a block without parameter and returned value");
        };
        myBlock();
    }
    3、定义一个简单的有参数没有返回值的block,如下:
    //有参数,没有返回值的block
    -(void)blockWithParameterButNoReturnData
    {
        void(^myBlock)(int) = ^(int num) {
            NSLog(@"%d",num*100);
        };
        myBlock(4);
    }
    4、定义一个有参数,有返回值得block,如下:
    //有参数,有返回值的block
    -(void)blockWithParameterAndReturnValue
    {
        int (^myBlock)(int) = ^(int num) {
            return num * 100;
        };
       int result =  myBlock(2);
        NSLog(@"This is a block with parameter and return value :%d",result);
    }
    5、现在分析一下block的存储域:
    运行下面函数:
    -(void)testBlock
    {
        void(^blockOne)(void) = ^ {
            NSLog(@"This is block one");
        };
        int c = 10;
        void(^blockTwo)(void) =^(void) {
            NSLog(@"This is a block two %d",c);
        };
        void(^blockThree)(void) =[blockTwo copy];
        NSLog(@"blockOne address is :%@",blockOne);
        NSLog(@"blockTwo address is :%@",blockTwo);
        NSLog(@"blockThree address is :%@",blockThree);
    }
    运行结果如下:
    结果是:
    blockOne因为没有使用任何外部变量,他的存储区域在全局区,而blockTwo因为使用了外部变量,则存储在堆。而两个内存地址一样,都位于堆内存中。
    另附:
         Block再内存中的位置分为三种类型:NSGlobalBlock、NSStackBlock、NSMallocBlock
         其中:NSGlobalBlock:类似函数,位于text段
                   NSStackBlock:位于栈内存,函数返回后Block将无效
                   NSMallocBlock:位于堆内存。 
    注:参考网上某个大神的写的。
  • 相关阅读:
    客户心声|腾讯云数据库助力国信证券反洗钱系统分布式改造
    腾讯Q2财报:腾讯云数据库收入同比增长超过30%
    云数据库架构思维升级,看这篇就够了
    产学研合作生态硬核来袭,共探数据库技术发展与应用
    金融数字化转型落地实践,腾讯云数据库的三问三答
    海外App 崩溃率监控 之 FireBase 接入
    python 2.7 脚本打包 exe
    浏览器滚动条css设置webkitscrollbar样式方式
    Debug命令和汇编指令介绍
    vite构建项目,SFC组件里style标签lang=postcss,css样式没有高亮的解决方案。
  • 原文地址:https://www.cnblogs.com/zhanggui/p/4656440.html
Copyright © 2020-2023  润新知