美文网首页
聊聊OC中的Block

聊聊OC中的Block

作者: vincentgemini | 来源:发表于2017-11-02 10:24 被阅读0次

对于block中的全局变量和静态变量,block中改变量的地址不发生变化;对于一般变量,block中会对此变量进行拷贝,其修改不会影响外部变量;对于block变量,block会将其转移到堆中(外部变量地址也会发上变化),block中直接可以修改此变量。

Block的用法

1、作为一个本地变量(local variable)

    returnType (^blockName)(parameterTypes) = ^returnType(parameters) {
        //blablabla
    };

2、作为@property

    @property (nonatomic, copy) returnType (^blockName)(parameterTypes);

3、作为方法的参数(method parameter)

    - (void)someMethodThatTakesABlock:(returnType (^)(parameterTypes))blockName; 

4、作为方法参数的时候被调用

    [someObject someMethodThatTakesABlock: ^returnType (parameters) {...}];

5、使用typedef来定义block

    typedef returnType (^TypeName)(parameterTypes);
    TypeName blockName = ^returnType(parameters) {...};

为什么使用weakSelf

通过 clang -rewrite-objc 源代码文件名 将代码转为c++代码(实质是c代码),可以看到block是一个结构体,它会将全局变量保存为一个属性(是__strong的),而self强引用了block这会造成循环引用。所以需要使用__weak修饰的weakSelf。

为什么在block里面需要使用strongSelf

是为了保证block执行完毕之前self不会被释放,执行完毕的时候再释放。这时候会发现为什么在block外边使用了__weak修饰self,里面使用__strong修饰weakSelf的时候不会发生循环引用

不会引起循环引用的原因

因为block截获self之后self属于block结构体中的一个由__strong修饰的属性会强引用self, 所以需要使用__weak修饰的weakSelf防止循环引用。
block使用的__strong修饰的weakSelf是为了在block(可以理解为函数)生命周期中self不会提前释放。strongSelf实质是一个自动变量,当block执行完毕就会释放自动变量strongSelf,不会对self进行一直进行强引用。

总结

外部使用了weakSelf,里面使用strongSelf却不会造成循环,究其原因就是因为weakSelf是block截获的属性,而strongSelf是一个自动变量会在函数执行完释放。

Demo 中有一些关于Block的使用说明。

相关文章

  • 聊聊OC中的Block

    对于block中的全局变量和静态变量,block中改变量的地址不发生变化;对于一般变量,block中会对此变量进行...

  • swift 调用 OC中的block

    OC中声明block; OC中实现block swift中实现

  • iOS原生&JS交互

    OC 获取js中的key OC调用js方法 JS调用OC中不带参数的block JS调用OC中带参数的block ...

  • Swift之闭包

    前言 闭包类似于OC的block,但是比OC的block应用面更广 在OC中block是匿名函数 在swift中函...

  • Swift 之闭包

    闭包 闭包类似于 OC 的 block,但是比 OC 的 block 应用面更广 在 OC 中 block 是匿名...

  • iOS Block本质笔记

    OC中定义block block访问外部参数 OC转C++分析 block的变量捕获机制 为了保证block能够正...

  • OC中block底层原理总结(下)

    关于OC中block的本质结构、block的变量捕获方式请查看OC中block底层原理总结(上)需要先看懂上篇文章...

  • swift 闭包(类似OC中block)

    swift中的闭包 类似OC中block OC中block 回顾创建个HttpTool类.h .m 控制器中 sw...

  • 深入 Block

    Block 前言 Block是OC中对C语言的扩展功能,是一种带有自动变量的匿名函数,Block在OC中的实现,点...

  • swift基础语法(十三)——闭包

    介绍 闭包和OC中的block非常相似OC中的block是匿名的函数Swift中的闭包是一个特殊的函数block和...

网友评论

      本文标题:聊聊OC中的Block

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