美文网首页iOS
swift进阶五:内存分区 & 小工具

swift进阶五:内存分区 & 小工具

作者: markhetao | 来源:发表于2020-12-11 19:55 被阅读0次

    swift进阶 学习大纲

    分享一个基于MachO进行内存分区动态库libfooplugin.dylib

    1. libfooplugin.dylib工具
    2. 内存分析

    1. libfooplugin.dylib工具

    • 该工具可分析CC++SwiftOC语言的指针所在区域

    1.1 安装:

    方式一:

    根目录下创建.lldbinit文件:

    vim ~/.lldbinit
    

    输入:

    plugin load /Users/XXX/XXX/libfooplugin.dylib
    

    (/Users/XXX/XXX/libfooplugin.dylib替换为自己的存放路径)

    方式二:

    • 任意目录下创建任意文件,文件内容为:
    plugin load /Users/XXX/XXX/libfooplugin.dylib
    

    (/Users/XXX/XXX/libfooplugin.dylib替换为自己的存放路径)

    • 在需要使用的工程中,选择刚才创建的文件
      image.png

    方式三:

    lldb中先调用方式二创建的文件

    image.png

    1.2 使用

    • 在lldb中:cat address + 指针地址,进行打印
      image.png

    2. 内存分析

    按照地址排列: 栈区 -> 堆区 -> 全局静态区 -> 常量区 -> 代码区内核区保留部分不再考虑范围内)

    image.png

    下面是实践验证过程。

    2.1 栈区

    • 局部变量


      image.png

    2.2 堆区

    • 对象的指针,在栈区开辟对象的内容,是通过alloc堆中开辟
      image.png

    2.3 全局静态区

    • 创建一个c语言项目,全局变量都存放在全局区
      image.png
    • 已初始化的,会直接分配内存,未初始化的,是被调用时,才分配内存。所以age地址age2
    • 全局静态区数据,在MachO文件中:
      已初始化全局变量存放在__Data.__data区域
      未初始化全局变量存放在__Data.__common区域

    补充,static const修饰的变量,实际只是一个别名没有独立内存空间

    image.png
    • swift中,直接在class外letvar创建的变量,都在全局静态区
    image.png
    • let a = 1: 无法直接打印内容,但可以汇编查看地址偏移,读取偏移后的地址内容:
      image.png
    • var b = 2
      image.png

    2.4 常量区

    • c语言const 修饰的变量,在常量区

      image.png
    • 本节,仅对这个小工具记录小实践

    相关文章

      网友评论

        本文标题:swift进阶五:内存分区 & 小工具

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