美文网首页
block学习

block学习

作者: 青宜结鬼章 | 来源:发表于2021-04-13 14:29 被阅读0次

1,在传值方定义一个block

typedefvoid(^requstBlock)(NSString* str);

2,在传方声明一个这个block的属性

@property (nonatomic, copy) requstBlock requstBlock;

3,在返回方法里面

__weak typeof (self)weakSelf = self;

    if(weakSelf) {

        weakSelf.requstBlock(self.textField.text);

    }

    [self dismissViewControllerAnimated:YES completion:nil];

4,接收方

  bViewController *bvc=[[bViewController alloc]init];

    bvc.backReference=self;

    bvc.requstBlock= ^(NSString*str) {

        self.label.text= str;

    };

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

5,注意事项。

    5.1最简单的循环引用问题。

    5.2.1,修饰符使用copy,只有copy之后的blcok才会在堆中,栈中block的的生命周期是和栈绑定的.

    5.2.1,在生命blcok属性的时候必须线思考一个问题:在block调用时,另一个线程有没有可能去修改block,如果不确定有没有这种情况的话,最好使用atomic,也就先保证block的原子性

比如这样一个Block类型:

typedef void (^MyBlockType)(int);

属性声明:

@property (copy) MyBlockType myBlock;

这里ARC和非ARC声明都是一样的,当然注意在非ARC下要releaseBlock。

但是,有了atomic来保证基本的原子性还是没有达到线程安全的,接着在调用时需要把Block先赋值给本地变量,以防止Block突然改变。因为如果不这样的话,即便是先判断了Block属性不为空,在调用之前,一旦另一个线程把Block属性设空了,程序就会crash,如下代码:

if (self.myBlock)

{

//此时,走到这里,self.myBlock可能被另一个线程改为空,造成crash

//注意:atomic只会确保myBlock的原子性,这种操作本身还是非线程安全的

self.myBlock(123);

}

所以正确的代码是(ARC):

MyBlockType block = self.myBlock;

//block现在是本地不可变的

if (block)

{

block(123);

}

导致block内存泄漏的原因就是看是否存在相互强引用 详情参考

https://blog.csdn.net/carson_zj/article/details/53043533

相关文章

  • iOS开发-由浅至深学习block

    iOS开发-由浅至深学习block iOS开发-由浅至深学习block

  • iOS Block详解

    学习Block的章节 Block介绍(源码解析) 代码被编译后: __MCBlock__method_block_...

  • block学习

    block学习 根据网上的block各种大神的资料,加入自己的理解。 一、初识block 1. block作用 b...

  • ObjC的Block中使用weakSelf/strongSelf

    学习block帖子ObjC的Block中使用weakSelf/strongSelf @weakify/@stron...

  • block学习

    1,在传值方定义一个block typedefvoid(^requstBlock)(NSString* str);...

  • block学习

    通用的 block 声明de的结构体 main 里面的这个block的描述的结构体 main 里面的这个block...

  • Block学习

    之前一直都只知道用block,没有对block进行过总结和深入的理解。 个人觉得block就是一个介于变量和函数中...

  • block学习

    block为什么是用copy修饰 block属性的声明,首先需要用copy修饰符,因为只有copy后的block才...

  • Block 学习

    block 构成部分 ^(参数列){行为主体}; 例如:^(int a) {return a*a}; bl...

  • Block学习

    Block 让我们先来了解下Block是怎么定义的:返回值类型(^block变量名)(形参列表) = ^(形参列表...

网友评论

      本文标题:block学习

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