美文网首页
对象内存地址信息

对象内存地址信息

作者: 东方奇迹 | 来源:发表于2021-08-31 11:21 被阅读0次

    class Persion {
    var age: Int?
    }
    var pInstance = Persion()
    var pType = Persion.self
    pInstance对象的内存结构:八个字节存放指向源类型地址的指针,八个字节存放引用计数,八个字节存放age属性值

    • 打印pInstance指针变量指向的内存地址 (前八个字节是指向源类型(metadata)的指针,metadata存放着类型相关的信息)

    • 打印Persion类在内存中的地址(不知道咋打印)

    • 打印Persion.self在内存中的地址(是一个源类型(metadata)的指针地址,metadata存放着类型相关的信息)

        withUnsafePointer(to: &pInstance) {
            print(" str value “pInstance” has address: \($0)")
        }
      
        withUnsafePointer(to: &pType) {
            print(" str value “pType” has address: \($0)")
        }
      

    str value “pInstance” has address: 0x0000000283b3b678
    (lldb) x/4xg 0x0000000283b3b678(指针变量内存地址)
    (指针变量所指向对象在堆空间中的内存地址)
    0x283b3b678: 0x0000000283544ce0 0x00000001008ebe78
    0x283b3b688: 0x0000000000000000 0x0100000204f64595
    (lldb) x/4xg 0x0000000283544ce0(指向源类型的指针地址)
    (源类型的地址)
    0x283544ce0: 0x00000001008ebe78 0x0000000000000003
    0x283544cf0: 0x0000000000000000 0x0000000000000001

    str value “pType” has address: 0x0000000283b3b680
    (lldb) x/4xg 0x0000000283b3b680(指针变量内存地址)
    (源类型的地址)
    0x283b3b680: 0x00000001008ebe78 0x0000000000000000
    0x283b3b690: 0x0100000204f64595 0x0000000281e6d1f0

    self、Self、Person

    self和Self:

    • self在类方法中代表当类,在实例方法中代表当前实例;
    • .self可以用在类型后面取得类型本身,在实例后面取得这个实例本身;
    • Self表示特定类型,可以用于协议(protocol)中限制相关的类型,可以用于类(Class)中来充当方法的返回值类型;可以代表当前类型;

    瞎猜之下:
    Person.self == Self == Person;
    Person.self == Self == Person和实例对象都关联着matadata元类数据信息,matadata元类数据以虚表的形式存放着类型相关信息;

    OC里面有实例对象、类对象、元类对象,及它们分别所存储的信息;
    swift里只发现了实例对象、元类型,及它们分别所存储的信息,没发现有类对象的概念,可能元类对象==类对象;
    注意:类类型和元类类型的相同点与不同点;

    相关文章

      网友评论

          本文标题:对象内存地址信息

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