zoukankan      html  css  js  c++  java
  • 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被销毁

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

  • 相关阅读:
    NUMBER BASE CONVERSION(进制转换)
    2776 寻找代表元(匈牙利算法)
    最长严格上子序列(二分优化)
    c++ bitset类的使用和简介
    笨小猴 2008年NOIP全国联赛提高组
    三国游戏 2010年NOIP全国联赛普及组
    全国信息学奥林匹克联赛(NOIP2014)复赛 模拟题Day2 长乐一中
    codevs 1704 卡片游戏
    热浪
    全国信息学奥林匹克联赛 ( NOIP2014) 复赛 模拟题 Day1 长乐一中
  • 原文地址:https://www.cnblogs.com/xyzaijing/p/3876823.html
Copyright © 2011-2022 走看看