iOS Block

作者: KAKA_move | 来源:发表于2021-04-02 22:19 被阅读0次

    什么是Block

    截获变量

    __block修饰符

    内存管理

    循环引用

    什么是Block?

    将函数及其执行上下文封装起来的对象。

    1. 函数
    2. 上下文
    3. 对象

    源码实现,看结构体

    *block的本质和函数调用

    截获变量

    1. 局部变量
    • 基本数据类型
      截回其置
    • 对象类型
      连同所有权修饰符一起截获
    1. 静态局部变量
      以指针形式截回
    2. 全局变量
      不截获
    3. 静态全局变量
      不截获

    __block修饰符

    一般情况下,对被截获的变量赋值操作时候使用__block修饰(赋值: 注意数组)
    否则的话就会编译报错

    • 对变量进行赋值时候的特点
      需要__block修饰符 ===> 局部变量(基本数据类型和对象类型)
      不需要__block修饰符 ===> 静态局部变量、全局变量、静态全局变量

    • __block修饰符的变量变成了对象

    • __forwarding指针是用来干什么的?

    Block的内存管理

    imp.isa = &_NSConcertStackBlock

    copy操作

    • 栈上 堆上

    • 堆上 增加其引用计数

    • 数据区 什么也不做

    • 栈上Block销毁
      变量和block都会被销毁

    • 栈上Block的Copy
      堆上有对应的的block和__block变量都会销毁

    • 栈上Block的Copy又发生了什么
      栈上Block变量的__forwaording指针指向的自己,copy之后,栈上的__foewarding指针指向堆上的__block变量
    • __forwaordig总结
    • __forwaordig存在意义
      都可以顺利的额访问同一个__block变量

    block的循环应用

    __weak避免产生循环应用

    • 为什么用__weak可以呢?应为截获成员变量是对象时候,是对其修饰符所有权一起引用的

    • Block总结
      什么是block?
      为什么block会产生循环引用?
      (截获后会有强引用,__block下要看是ARC还是MRC)
      怎么理解block截获变量的特性?

    遇到那些循环应用,怎么解决的?

    相关文章

      网友评论

          本文标题:iOS Block

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