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里只发现了实例对象、元类型,及它们分别所存储的信息,没发现有类对象的概念,可能元类对象==类对象;
注意:类类型和元类类型的相同点与不同点;
网友评论