iOS Block

作者: HackerOnce | 来源:发表于2015-05-24 16:53 被阅读930次

    Block 语法:

    作为当地变量: 

     returnType (^blockName)(parameterTypes) = ^returnType(parameters) { ... ... }

    作为属性:  

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

    作为方法参数:

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

    作为方法调用的参数:

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

    作为typeDef:

    typedef returnType(^typeName)(parameterTypes)

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

    Block算是一个对象

    BLock对变量的捕获规则

    1 静态存储区的变量,例如全局变量,方法中的static变量,

    可引用可修改

    2 block接受的参数

    传值,可修改,和一般函数的参数相同

    3 栈变量:(被捕获的上下文变量)

    const,不可修改,当block被copy后,block会对ID类型的变量产生弱引用,每次执行block 时捕获到的变量都是最初的值

    4 栈变量(有block 前缀)

    引用,可修改。如果是id类型则不会被block  retain, 必须手动处理其内存管理

    如果是C类型变量,blcok 被copy到heap后,改值也会被挪动到heap

    内存:

    Block_copy()和Block_release()必须匹配

    _block修饰词会将原本简单类型转化为较大的struct,给内存调用带来额外的开销

    循环引用:block 被copy之后,该block会对他捕获到的对象产生Strong引用,如果self引用的block,block捕获了self,将会造成内存循环,解决方法

    如果捕获到的是当前变量的成员变量,也会造成对self 的引用,同样会造成内存循环

    Block是个对象,他对他所捕获到的值都进行强引用(strong)

    相关文章

      网友评论

        本文标题:iOS Block

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