• Block学习总结


    最近网上浏览了一些关于Block的文章,自己进行一下消化吸收。

    Void (^blockName)(parma)-> Block声明

    Void (^) (parma){};  ->Block定义 可省略返回值  ^(parma){}; 

    当Block作为参数传递时 ->  (Void (^)(parma))blockName

    常用 -> typedef Void (^blockName)(parma);

    关于Block一些底层原理。通过 clang -rewrite-objc main.m 命令将OC转换为C++后,了解到Block的一些运作原理。

    1. Block分为3种状态   _NSConcreteGlobalBlock,_NSConcreteStackBlock,_NSConcreteMallocBlock,分别为全局的Block、栈上的Block、堆上的Block,ARC模式中,第二种会隐式的将栈上的block拷贝到堆上。  

    2.关于Block内部使用外部变量的问题。  

      2.1 局部变量(基础数据类型)类似于值传递,所以在Block内部不能对局部变量修改,类似于函数中的值传递。

           局部变量(对象)从.cpp文件中可以看到,在block的结构体中,强引用了局部对象,相当于引用计数+1,所以局部变量不会被销毁。当使用这个局部变量的时候,类似于函数中的指针传递,此时可以通过指针改变局部变量的值。

           局部变量被__block修饰的时候,会生成一个__Block_byref_parma_0的结构体。这时候局部变量在block内部改变的时候,相当于也是指针传递,所以外部的值也被修改。(用__block修饰的局部变量还会生成copy和dispose俩个函数,用于管理内存)

           局部变量被static 修饰的时候,block结构体中会多出一个*parma的指针,所以在block内部修改被static修饰的局部变量的时候,传递的是指针,也可以影响外部的局部变量。

      2.2 全局变量(基础数据类型) 可以进行修改。

            实例变量 在Block内部引用实例变量(无论是否使用get方法),block底层会生成一个对该实例变量的一个强引用,如果该实例持有block,会造成循环引用。避免方法用__weak修饰使用的实例变量。 

        

                          

  • 相关阅读:
    经典测试工程师面试题(一)
    python面试题2
    python面试题1
    软件测试面试题2
    软件测试面试题1
    python读写csv文件
    死亡还是合并?和李开复聊聊走投无路创业公司(转)
    项目如何开始:怎样和客户谈需求(转)
    [转载]给IT人员支招:如何跟业务部门谈需求分析?
    VS2013的一些常用快捷键
  • 原文地址:https://www.cnblogs.com/jztsdwn/p/8668815.html
Copyright © 2020-2023  润新知