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

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容