美文网首页
block的基础知识总结

block的基础知识总结

作者: 钎探穗 | 来源:发表于2016-06-09 20:36 被阅读37次
    • block是匿名函数,能够实现函数回调功能

    • block可以访问block函数以及语法作用区域以内的外部变量

    • 用于页面之间通信,同时可以进行传值
      void(^block)(void) = ^(void) { };
      其中:
      1.void(^block)(void)是类型
      2.block是变量名
      3.^(void){};是block实现 ,上述方法等号后边的返回值类型和参数列表都可以省略.


    block的内存管理:

    • 没有使用局部变量的block内存存储在全局区
    • block内部使用局部变量的时候内存存储在栈区.
    • 当block变量定义为属性的时候,必须使用copy修饰,retain无效,即retain和assign会造成野指针问题.
      (当对block进行copy操作的时候,此时block的内存区域为堆区.)

    1.当block里面会有b类相关的参数要回调回去的时候,属性用copy修饰,将其拷贝到堆里面,这样即便栈释放掉了,b类的指针也在堆中存在,能够成功的回调回去。
    2.如果语法块仅仅是执行而不再回调回去了, 比如操作某个数据库,修改某个单利类的属性,发送某个通知之类的,则可以用weak来修饰。

    注意:这里不都用copy,原因是优化内存。 如果这个类要传入1000Block来执行,而这个类又不会马上释放掉的话,用copy是不是就拷贝了1000个在堆里面? 这样就会占用很大一部分内存,如果使用了weak将不必要的执行后就可以马上释放掉是不是就节约了很多的内存了。

    ** __weak在ARC下修饰,__block在MRC下修饰,防止循环引用.
    ** __block:第二个作用,
    修饰局部变量,MRC和ARC通用.***在block内部不能直接修改局部变量的值, 如果想修改必须声明成__block类型的变量 ***

    相关文章

      网友评论

          本文标题:block的基础知识总结

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