zoukankan      html  css  js  c++  java
  • C语言函数指针 和 OC-Block

    C语言函数指针 和 OC-Block

    一、 C语言函数指针  

    关于函数指针的知识详细可参考: http://www.cnblogs.com/mjios/archive/2013/03/19/2967037.html

    #include <stdio.h>
    //在main之前定义一个函数
    int sum(int a, int b) {
        return a + b;
    }
    
    int main()
    {
        //定义函数指针变量pfunc,指向sum函数
        int (*pfunc)(int a, int b) = sum;
    // int (*pfunc)(int, int) = sum;
    // int (*pfunc)() = sum;
    // int (*pfunc)(int a,int b);  pfunc = sum;
        
        // 利用指针变量p调用函数
        int result = pfunc(1, 3);
      //int result = (*pfunc)(1, 3); 也可以
      
        return 0;
    }

    二、OC中block知识

    1、什么是Blocks 

         Block是一个C级别的语法以及运行时的一个特性,和标准C中的函数(函数指针)类似,但是其运行需要编译器和运行时支持,从ios4.0开始就很好的支持Block。 

    2、在ios开发中,什么情况下使用Block 

         Block可以作为类的属性,作为方法的参数,还可以在方法内部定义一个block局部变量,用来保存一段代码。简单来说,block就是一个特殊类型的变量(和变量int a一样),保存一段代码,然后在适当的时候运行,通常用来做并发任务、遍历、以及回调。 

    3、直接声明、定义、调用block类型的变量

    //
    //  ViewController.m
    //
    
    #import "ViewController.h"
    
    @implementation ViewController
    {
        int(^sumBlock)(int x,int y); //声明int(^)(int,int)类型变量sumBlock,block是匿名的函数int (^)(int,int)  有名字的函数int sum(int,int)
    }
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        sumBlock = ^int(int x, int y){ //block赋值(定义)
            return x+y;
        };
    }
    
    - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
        if(sumBlock) sumBlock(10,20); //block调用
    }
    
    @end

    4. block的typedefine别名

    typedef int(^IntBlock)(int,int);

     //int(^)(int,int)类型取了个别名叫IntBlock,  因为int(^)(int,int)是一种特殊的数据类型:Block,所以typedef语句之后,IntBlock就是一种数据类型,和int/float/double一样。这样使用起来就非常方便。

     

    5.block作为类的属性

    //在创建完block的时候需要调用copy的方法。copy会把block从栈上移动到堆上。

    @property (copy,nonatomic) int(^sumBlock)(int,int);  //定义了一个int(^)(int,int)类型的属性sumBlock

    @property (copy,nonatomic) IntBlock intBlock;           //定义了一个int(^)(int,int)类型的属性intBlock

     

    6.block作为方法参数(形参)的写法

    - (void)testBlock:(void (^) ()) aBlock;

    - (void)printResult:( int (^) (int, int)sumBlock;  //此处( int(^)(int, int) )sumBlock的类型

    可见当block作为函数参数时,只是将block类型用()括起来,然后将block名字写在block类型后面而已

    调用方法时,给block类型的形参赋值:

    [self printResult:^int(int x, int y)

            return x+y;

        }];

    [WZCategory  mj_setupReplacedKeyFromPropertyName:^NSDictionary *{

            return @{@"ID":@"id"};   

    }];

     

    7、__block  关键字 

         一个Block内部时可以使用自身作用域外的静态变量(static变量),全局变量(extern变量),__block修饰的自由变量(定义一个变量的时候,如果不加存储修饰符,默认情况下就是自由变量auto,auto变量保存在stack中的。除了auto之外还存在register,static等存储修饰符),对于自由变量,在Block中只读的。 如果想要在block中使用auto变量,需要在自由变量之前加上__block关键字修饰。

     

    三、C语言函数指针 和 OC-Block 对比

     1.声明和调用写法对比

     int (*CFunc) (int a);        指向函数的指针
     int result = CFunc(10); 
     int (^BFunc)  (int  a);     保存一段代码的block, block是匿名的函数int (^)(int,int)  有名字的函数int sum(int,int)
     int result = BFunc(10);  

    2. block和函数指针都可以看成是一种数据类型,就像int、float、NSString一样。

    3. iOS中将用block定义好的变量看作是一个对象,block对象在作为属性时使用copy关键字。

  • 相关阅读:
    npm教程2
    02.RIP——CCNP学习笔记
    01.静态路由——CCNP学习笔记
    The 10th SWJTU ACM Online Tutorial
    visual studio 2005 常用按键
    Python垃圾回收机制
    私人网盘系统2.0—全部升级为layUI+PHP(持续更新中)
    Layui框架+PHP打造个人简易版网盘系统
    翻译app的开发全过程---编码+打包+上架
    值得认真学习的6 个 JavaScript 框架
  • 原文地址:https://www.cnblogs.com/stevenwuzheng/p/5516985.html
Copyright © 2011-2022 走看看