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

swift进阶 学习大纲

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

  • 版权: 【逻辑教育】
    链接: https://pan.baidu.com/s/1mSHhy5s3pizlNnVfns7eSQ 密码: 5ubg
  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

  • 栈区 是从高地址低地址分配空间。
  • 堆区全局静态区常量区代码区 都是从低地址高地址分配空间
    (详细的内存分区,可参考OC底层原理二十五:内存五大区 & 多线程)

下面是实践验证过程。

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进阶五:内存分区 & 小工具)