项目作者: CoderMJLee

项目描述 :
Utils for viewing memory in Swift.
高级语言: Swift
项目地址: git://github.com/CoderMJLee/Mems.git
创建时间: 2019-06-24T05:17:05Z
项目社区:https://github.com/CoderMJLee/Mems

开源协议:MIT License

下载


Mems

Utils for viewing memory in Swift.

用来窥探Swift内存的小工具

用法

  1. func show<T>(val: inout T) {
  2. print("-------------- \(type(of: val)) --------------")
  3. print("变量的地址:", Mems.ptr(ofVal: &val))
  4. print("变量的内存:", Mems.memStr(ofVal: &val))
  5. print("变量的大小:", Mems.size(ofVal: &val))
  6. print("")
  7. }
  8. func show<T>(ref: T) {
  9. print("-------------- \(type(of: ref)) --------------")
  10. print("对象的地址:", Mems.ptr(ofRef: ref))
  11. print("对象的内存:", Mems.memStr(ofRef: ref))
  12. print("对象的大小:", Mems.size(ofRef: ref))
  13. print("")
  14. }

整型

  1. var int8: Int8 = 10
  2. show(val: &int8)
  3. // -------------- Int8 --------------
  4. // 变量的地址: 0x00007ffeefbff598
  5. // 变量的内存: 0x0a
  6. // 变量的大小: 1
  7. var int16: Int16 = 10
  8. show(val: &int16)
  9. // -------------- Int16 --------------
  10. // 变量的地址: 0x00007ffeefbff590
  11. // 变量的内存: 0x000a
  12. // 变量的大小: 2
  13. var int32: Int32 = 10
  14. show(val: &int32)
  15. // -------------- Int32 --------------
  16. // 变量的地址: 0x00007ffeefbff588
  17. // 变量的内存: 0x0000000a
  18. // 变量的大小: 4
  19. var int64: Int64 = 10
  20. show(val: &int64)
  21. // -------------- Int64 --------------
  22. // 变量的地址: 0x00007ffeefbff580
  23. // 变量的内存: 0x000000000000000a
  24. // 变量的大小: 8

枚举

  1. enum TestEnum {
  2. case test1(Int, Int, Int)
  3. case test2(Int, Int)
  4. case test3(Int)
  5. case test4(Bool)
  6. case test5
  7. }
  8. var e = TestEnum.test1(1, 2, 3)
  9. show(val: &e)
  10. // -------------- TestEnum --------------
  11. // 变量的地址: 0x00007ffeefbff580
  12. // 变量的内存: 0x0000000000000001 0x0000000000000002 0x0000000000000003 0x0000000000000000
  13. // 变量的大小: 32
  14. e = .test2(4, 5)
  15. show(val: &e)
  16. // -------------- TestEnum --------------
  17. // 变量的地址: 0x00007ffeefbff580
  18. // 变量的内存: 0x0000000000000004 0x0000000000000005 0x0000000000000000 0x0000000000000001
  19. // 变量的大小: 32
  20. e = .test3(6)
  21. show(val: &e)
  22. // -------------- TestEnum --------------
  23. // 变量的地址: 0x00007ffeefbff580
  24. // 变量的内存: 0x0000000000000006 0x0000000000000000 0x0000000000000000 0x0000000000000002
  25. // 变量的大小: 32
  26. e = .test4(true)
  27. show(val: &e)
  28. // -------------- TestEnum --------------
  29. // 变量的地址: 0x00007ffeefbff580
  30. // 变量的内存: 0x0000000000000001 0x0000000000000000 0x0000000000000000 0x0000000000000003
  31. // 变量的大小: 32
  32. e = .test5
  33. show(val: &e)
  34. // -------------- TestEnum --------------
  35. // 变量的地址: 0x00007ffeefbff580
  36. // 变量的内存: 0x0000000000000000 0x0000000000000000 0x0000000000000000 0x0000000000000004
  37. // 变量的大小: 32

结构体

  1. struct Date {
  2. var year = 10
  3. var test = true
  4. var month = 20
  5. var day = 30
  6. }
  7. var s = Date()
  8. show(val: &s)
  9. // -------------- Date --------------
  10. // 变量的地址: 0x00007ffeefbff580
  11. // 变量的内存: 0x000000000000000a 0x0000000000000001 0x0000000000000014 0x000000000000001e
  12. // 变量的大小: 32

  1. class Point {
  2. var x = 11
  3. var test = true
  4. var y = 22
  5. }
  6. var p = Point()
  7. show(val: &p)
  8. // -------------- Point --------------
  9. // 变量的地址: 0x00007ffeefbff590
  10. // 变量的内存: 0x0000000101023680
  11. // 变量的大小: 8
  12. show(ref: p)
  13. // -------------- Point --------------
  14. // 对象的地址: 0x0000000101023680
  15. // 对象的内存: 0x00000001000072d8 0x0000000200000002 0x000000000000000b 0x0000000000000001 0x0000000000000016 0x3030303030303030
  16. // 对象的大小: 48

数组

  1. var arr = [1, 2, 3, 4]
  2. show(val: &arr)
  3. // -------------- Array<Int> --------------
  4. // 变量的地址: 0x00007ffeefbff598
  5. // 变量的内存: 0x0000000101023800
  6. // 变量的大小: 8
  7. show(ref: arr)
  8. // -------------- Array<Int> --------------
  9. // 对象的地址: 0x0000000101023800
  10. // 对象的内存: 0x00007fff9c30f848 0x0000000200000002 0x0000000000000004 0x0000000000000008 0x0000000000000001 0x0000000000000002 0x0000000000000003 0x0000000000000004
  11. // 对象的大小: 64

字符串

  1. var str1 = "123456789"
  2. // taggerPtr(tagger pointer)
  3. print(str1.mems.type())
  4. show(val: &str1)
  5. // -------------- String --------------
  6. // 变量的地址: 0x00007ffeefbff580
  7. // 变量的内存: 0x3837363534333231 0xe900000000000039
  8. // 变量的大小: 16
  9. var str2 = "1234567812345678"
  10. // text(字符串存储在TEXT段)
  11. print(str2.mems.type())
  12. show(val: &str2)
  13. // -------------- String --------------
  14. // 变量的地址: 0x00007ffeefbff570
  15. // 变量的内存: 0xd000000000000010 0x8000000100007610
  16. // 变量的大小: 16
  17. var str3 = "1234567812345678"
  18. str3.append("9")
  19. // heap(字符串存储在堆空间)
  20. print(str3.mems.type())
  21. show(val: &str3)
  22. // -------------- String --------------
  23. // 变量的地址: 0x00007ffeefbff560
  24. // 变量的内存: 0xf000000000000011 0x00000001007b6ad0
  25. // 变量的大小: 16
  26. show(ref: str3)
  27. // -------------- String --------------
  28. // 对象的地址: 0x00000001007b6ad0
  29. // 对象的内存: 0x00007fff963e9660 0x0000000200000002 0x0000000000000018 0xf000000000000011 0x3837363534333231 0x3837363534333231 0x0000000000200039 0x0000000000000000
  30. // 对象的大小: 64

设置字节显示格式

  1. var int64: Int64 = 10
  2. print("1个字节为1组 :", Mems.memStr(ofVal: &int64, alignment: .one))
  3. // 1个字节为1组 : 0x0a 0x00 0x00 0x00 0x00 0x00 0x00 0x00
  4. print("2个字节为1组 :", Mems.memStr(ofVal: &int64, alignment: .two))
  5. // 2个字节为1组 : 0x000a 0x0000 0x0000 0x0000
  6. print("4个字节为1组 :", Mems.memStr(ofVal: &int64, alignment: .four))
  7. // 4个字节为1组 : 0x0000000a 0x00000000
  8. print("8个字节为1组 :", Mems.memStr(ofVal: &int64, alignment: .eight))
  9. // 8个字节为1组 : 0x000000000000000a