• 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被销毁

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

  • 相关阅读:
    JAVA环境搭建之MyEclipse10+jdk1.8+tomcat8环境搭建详解
    web.xml 配置 contextConfigLocation
    详解JDBC与Hibernate区别
    copy running-config startup-config 与 copy startup-config running-config
    CSS实现垂直居中的常用方法
    dskms改为ckplayer播放器
    apache2 不支持php文件 解决办法
    Linux下修改Mysql密码的三种方式
    Debian/Ubuntu下安装Apache的Mod_Rewrite模块的步骤
    DIV+ul+LI实现表格效果以及div带滑动条
  • 原文地址:https://www.cnblogs.com/xyzaijing/p/3876823.html
Copyright © 2020-2023  润新知