zoukankan      html  css  js  c++  java
  • Objective

    在前面我们讲过许多数据类型, 比如基本数据类型, 枚举, 结构体等等, 这次我们来讲最后一个OC中的最后一个数据类型, 那就是block, 在OC开发中, block有些类似函数指针, 但又不完全一样, 下面让我们来看看:


    例子:

    #import <Foundation/Foundation.h>
    
    int sum(int a, int b)
    {
        return a + b;
    }
    
    int main(int argc, const char * argv[])
    {
        int (*p) (int, int) = sum;
        int a = p(10, 20);
        
        NSLog(@"a = %d", a);
        
        return 0;
    }
    


    打印出来的结果:

    2015-01-29 16:05:21.315 3.block[3436:296165] a = 30
    



    这个就是我们以前所写的函数指针, 利用函数指针来进行一些别的操作, 下面我们来看看block的例子:

    #import <Foundation/Foundation.h>
    
    int main(int argc, const char * argv[])
    {
        int (^sumBlock)(int, int) = ^(int a, int b)
        {
            return a + b;
        };
        
        NSLog(@"sum = %d", sumBlock(10, 2));
        
        return 0;
    }
    

    结果:

    2015-01-29 16:06:12.122 3.block[3448:296785] sum = 12
    




    block其实还可以设置无参数类型, 比如:

    #import <Foundation/Foundation.h>
    
    int main(int argc, const char * argv[])
    {
        void (^Myblock)() = ^{
            NSLog(@"我是一个block.");
        };
        
        Myblock();
        
        return 0;
    }
    

    打印出来的结果:

    2015-01-29 16:07:54.362 3.block[3457:297419] 我是一个block.



    block还可以嵌套循环使用, 比如:

    #import <Foundation/Foundation.h>
    
    int main(int argc, const char * argv[])
    {
        void (^Myblock)(int) = ^(int n ){
            for (int i = 0; i < n; i++) {
                NSLog(@"我是block");
            }
        };
        
        Myblock(5);
        
        return 0;
    }
    

    打印出来的结果:

    2015-01-29 16:29:46.207 3.block[3510:305285] 我是block
    2015-01-29 16:29:46.207 3.block[3510:305285] 我是block
    2015-01-29 16:29:46.208 3.block[3510:305285] 我是block
    2015-01-29 16:29:46.208 3.block[3510:305285] 我是block
    2015-01-29 16:29:46.208 3.block[3510:305285] 我是block
    

    这种用法看上去好像似曾相识, 其实和函数的调用方法很类似, 但block的效率比函数的要高, 所以apple官方非常推荐我们使用block.



    block也还可以使用typedef定义, 比如:

    #import <Foundation/Foundation.h>
    
    typedef int (^MyBlock)(int, int);
    
    int main(int argc, const char * argv[])
    {
        MyBlock sumBlock = ^(int a, int b) {
            return a + b;
        };
        
        NSLog(@"sum = %d", sumBlock(100, 200));
        
        return 0;
    }
    

    打印出来的结果:

    2015-01-29 16:34:51.012 3.block[3526:307912] sum = 300
    





    看了那么多的好处, 那么block是不是真的是百分百好呢, 其实不以为然, 使用block也有注意事项, 下面我们来看看:



    这样子是不可以直接修改局部变量的, 会报错:

    Variable is not assignable (missing __block typer specifier)
    



    如果要在block里面修改局部变量, 那么必须得加上__block:

    #import <Foundation/Foundation.h>
    
    int main(int argc, const char * argv[])
    {
        __block int a = 10;
        
        void (^Myblock)() = ^{
            a = 20;
        };
        
        return 0;
    }
    






    还有更多的block使用方法就让大家慢慢去挖掘吧~~~这次就讲到这里, 下次我们继续~~~

  • 相关阅读:
    生成数据库结构设计说明书的存储过程
    C#检测上传图片是否安全函数
    设定下拉列表控件DropDownList,复选按钮CheckBox,RadioButton默认值总结测试
    C#批量重命名工具V2.0
    个人一些工作经验方式积累办法
    修身《孟子》尽心篇
    linux 命令 lspci lsusb
    重拾信心
    linux eclipse
    A lunch in Gordon Market with WWF
  • 原文地址:https://www.cnblogs.com/iOSCain/p/4282817.html
Copyright © 2011-2022 走看看