• block内存管理


    block默认是存储在栈内存中的,需要做一些操作才能到堆中

    MRC情况下-------------------

    这种情况下block创建以后需要做block_copy()操作才能复制到堆中,如果block在栈中,是不会对block内使用的对象做操作的

    但是如果你的block已经拷贝到了堆中,你就要注意了,因为此时block会对块内的对象做retain操作,所以如果block已经在堆中,并且块要访问对象的话,

    需要使用__block 修饰符声明变量,来组织block对块内的对象做retain操作

    ::对对象的访问包括调用对象的方法或访问对象的属性变量等,如果block在类的内部,block块内直接访问_xxx等变量,看似没有self等,但其实也访问了该对象,其实是通过self->XXX访问的

    所以此时必须要加__block修饰

    ——————————————

    如果是ARC环境

    应该使用__weak 或者__unretained_unsafe修饰block

    此外如果是operation中的block访问对象,且这个operation不是添加到主队列里面的

    这时候访问self或者对象不需要加前置修饰符,因为只有主线程有运行循环引用着它,

    其他的线程都是干完活以后直接被销毁,所以其内部相关变量也就不存在了(block

    并且如果是self-》operationQueue-》operation-》一些block,此时必须不能用修饰符去修饰

    因为如果用了修饰符,就有可能self缺少强引用而被销毁,为什么会缺少强引用呢?

    不是有强指针指着呢吗?因为强指针有时候会在主线程里,而你添加的block操作添加到了其他线程里

    出了那个强引用的作用域,但是其他线程里面block操作还没做完,此时已经没有了强引用,self被销毁

    剩下的操作执行完就停止了

  • 相关阅读:
    mysql 数据库 分表后 怎么进行分页查询?Mysql分库分表方案?
    mysql分库分区分表
    Mysql分表和分区的区别、分库和分表区别
    shell 浮点数和整数比较大小
    Domino's Pizza 点餐
    Long John Silver's 点餐
    韩国bibigo饺子做煎饺到方法
    其他的知名餐饮
    KFC 点餐
    Macdonald 点餐
  • 原文地址:https://www.cnblogs.com/xyzaijing/p/3876823.html
走看看 - 开发者的网上家园