美文网首页
关于block

关于block

作者: MichalWilson | 来源:发表于2017-08-01 15:15 被阅读6次

block是在iOS 4.0之后出现的,封装了一段代码并将这段代码当做变量,通过block()的方式进行回调,说白了,就是把一个方法或者一些属性封装在一个box里面,然后再给box起个名字,想用这个方法或者属性的时候,就呼叫box的名字,然后自动调用里面的方法或者属性来使用.下面来说一下block的特点:

1.block的代码是内联的,效率和使用比较方便

2.block对外部变量默认是只读属性,封闭性比较强

下面先来认识一下block的构成,如下图(人家的图),block的=好的另一侧返回值是可以省略的,然后^符号衔接一个参数列表,使用括号包起来,告诉编译器这是一个block,然后使用大括号将block的代码封装起来.

block代码构造

对于希望在block中修改的外界局部变量,我们可以在这些变量上加上 __block关键字来修饰,__blcok的作用是把只读变量从栈上copy到堆上,等数据处理结束,再从堆上返回到栈上 ,这样就能在block中修改这些变量.比如:

int X = 10;

void (^printXAndY)(int) = ^(int y){

printf("%d %d\n",X,y);

};

printXAndY(345); print:10 345

在block块儿里面只能使用外部变量而不能修改外部变量,如果需要使用,用__block来修饰

__block int X = 10;

void (^printXAndY)(int) = ^(int y){

X = X + y;

printf("%d %d\n",X,y);

};

printXAndY(345);

下面来介绍一下block的应用

1.传值

a.首先声明一个block,注意要用copy来修饰

@property (nonatomic, copy)void (^changeColorBlock)(UIColor* currentColor);

b.给block内的参数赋值

UIColor *currentColor = [UIColor lightGrayColor];

_changeColorBlock(currentColor);

c.回调

NextViewController * nextVC= [[NextViewController alloc]init];

nextVC.changeColorBlock = ^(UIColor *currentColor) {

self.view.backgroundColor = currentColor;

};

[self presentViewController:nextVC animated:YES completion:nil];

2.调用方法

block名称后面的括号中不仅可以声明变量,也可以是方法,例如

__block NSInteger localCounter = 42;

__block char localCharacter;

void (^ablock)(void) = ^(void){

localCharacter = 'a';

++localCounter;

};

localCharacter = 'b';

ablock();

看一下输出

输出结果

ablock()的调用执行了localCharacter = 'a';和++localCounter;,所以localCharacter = a,localCounter = 43.

相关文章

  • iOS面试之Block大全

    Block Block内容如下: 关于Block 截获变量 __block修饰符 Block的内存管理 Block...

  • iOS面试之Block模块

    Block Block内容如下: 关于Block 截获变量 __block修饰符 Block的内存管理 Block...

  • 详细的探讨一下Block(讨论篇、基础篇、实质篇)

    章节目录 关于Block的讨论篇 Block的基础篇 Block的实质篇 讨论篇: 为什么要看Block? 为了更...

  • 关于block(4)

    关于block(4) 标签: iOS 技术 接上篇,我们继续探究block。 block的copy属性 研究到这里...

  • block

    一.关于block block是将函数及其执行上下文封装起来的对象。 __block_impl结构体为 block...

  • 关于Block

    转化前代码 用clang命令clang -rewrite-objc testBlockM.m 关注 isa:isa...

  • 关于Block

    1.Block基本用法: block声明返回值(^block变量名)(参数)void(^block)(); blo...

  • 关于block

    block是在iOS 4.0之后出现的,封装了一段代码并将这段代码当做变量,通过block()的方式进行回调,说白...

  • 关于block

    当引用到外部的变量 1 无__block关键字时,内部直接创建一个同名变量,然后赋值。所以内部变量的地址 跟外面是...

  • 关于Block

    前段时间深受block循环引用的毒害,花时间研究下。 一、Block是C语言的一种数据类型,是一段提前准备好的代码...

网友评论

      本文标题:关于block

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