美文网首页
Block 和 函数指针

Block 和 函数指针

作者: f8d1cf28626a | 来源:发表于2022-01-16 18:16 被阅读0次

Block 和 函数指针的区别

block就是一个代码块,但是它的神奇之处在于在内联(inline)执行的时候(这和C++很像)还可以传递参数。同时block本身也可以被作为参数在方法和函数间传递,这就给予了block无限的可能。

block如何申明(对比于c语言中的函数申明)

第一个区别,函数指针是对一个函数地址的引用,这个函数在编译的时候就已经确定了。而block是一个函数对象,是在程序运行过程中产生的。在一个作用域中生成的block对象分配在栈(stack)上,和其他所有分配在栈上的对象一样,离开这个作用域,就不存在了。

Block允许开发者在两个对象之间将任意的语句当做数据进行传递,往往这要比引用定义在别处的函数直观。

Block实体形式如下:

^(传入参数列){行为主体};

Block实体开头是“^”,接着是由小括号所包起来的参数列(比如 int a, int b, int c),行为主体由大括号包起来,专有名字叫做block literal。行为主体可以用return回传值,类型会被compiler自动辨别。如果没有参数列要写成: ^(void)。

例如下面的一个例子:

^(int a){return a*a;};

这是代表Block会回传输入值的平方值(int a 就是参数列, return a*a; 就是行为主体)。记得行为主体里最后要加“;”,因为是叙述,而整个{}最后也要加“;”,因为Block是物件实体。

在ios开发中,blocks是对象,它封装了一段代码,这段代码可以在任何时候执行。Blocks可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值。它和传统的函数指针很类似,但是有区别:blocks是inline的,并且它对局部变量是只读的。

Blocks的定义:

int (^myBlock) (int a,int b) = ^(int a,int b){

return a+b;

};

定义了一个名为myBlock的blocks对象,它带有两个int参数,返回int。等式右边就是blocks的具体实现,是不是有点像方法的定义?

Blocks可以访问局部变量,但是不能修改。比如下面的代码就会报编译错 

int num = 0;

//使用block

int (^myBlock) (int a,int b) = ^(int a,int b){

num = a+b;

return num;

};

如果要修改就要加关键字:__block (注意,是两个下划线"_")

__block int num = 0;

//使用block

int (^myBlock) (int a,int b) = ^(int a,int b){

num = a+b;

return num;

};

作为函数的参数,blocks某种意义上替代了回调函数或者delegate。当函数调用了,假设某个事件触发,这时blocks里的内容就会运行。这样有利于代码的整合和阅读,你不需要到处去实现委托方法了。

相关文章

  • Objective-C基础学习之typedef和Block

    1.函数指针回顾 函数指针使用 函数指针别名 2.block和typedef block使用 block别名

  • typedef和Block

    1.函数指针回顾 函数指针使用 函数指针别名 2.block和typedef block使用 block别名

  • ios的block原理

    block:代码块,函数指针和指针 block:使用copy关键字 堆block:@propetry 栈block...

  • ios block篇

    1.block的实质是对象,一个函数指针,指向代码块。 2.函数指针和block的格式对比 1).函数指针 voi...

  • Block 和 函数指针

    Block 和 函数指针的区别 block就是一个代码块,但是它的神奇之处在于在内联(inline)执行的时候(这...

  • Block学习

    block和函数指针的理解; 相似点 函数指针和Block都可以实现回调的操作,声明上也很相似,实现上都可以看成是...

  • Block

    Block本质 block 本质是一个OC对象,也存在 isa 指针。或者说Block 是封装了函数调用和函数调用...

  • iOS基础面试题之Block篇

    对block的综合理解 block的实质对象, 一个函数指针, 指向代码块, 以及上下文所需的变量 函数指针和bl...

  • 04-Block专题

    对block的综合理解 block的实质对象, 一个函数指针, 指向代码块, 以及上下文所需的变量 函数指针和bl...

  • 面试复习-Block

    本质 block本质是一个oc对象,内部有isa指针 block是封装了函数和函数调用环境的oc对象 block内...

网友评论

      本文标题:Block 和 函数指针

      本文链接:https://www.haomeiwen.com/subject/rnnfhrtx.html