Swift,string和内存地址
有什么我不理解如何Swiftpipe理String(s)
内存地址String(s)
1.引用types
这里foo
和boo
是指向相同内存位置的 2个指针。
class Foo { } let foo = Foo() let boo = foo unsafeAddressOf(foo) // "UnsafePointer(0x7FCD13719BE0)" unsafeAddressOf(boo) // "UnsafePointer(0x7FCD13719BE0)"
好。
2.值types
let word0 = "hello" let word1 = word0
现在word0
和word1
是value types
但是这里涉及copy on write
机制的copy on write
。
但是,Swift只有在绝对必要的情况下才会在幕后执行实际的复制。 Swiftpipe理所有值复制以确保最佳性能,并且您不应该避免分配尝试抢占此优化。 https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/ClassesAndStructures.html#//apple_ref/doc/uid/TP40014097-CH13-XID_134
那为什么他们有两个不同的内存地址?
unsafeAddressOf(word0) // "UnsafePointer(0x7FCD1342ACE0)" unsafeAddressOf(word1) // "UnsafePointer(0x7FCD13414260)"
3.更多
另外请注意, String
是一个符合 AnyObject
的struct
。
testing了Xcode 7 GM Playground和Swift 2.0。
func unsafeAddressOf(object: AnyObject) -> UnsafePointer<Void>
需要一个AnyObject
参数,即一个类的实例。 它返回指向由object
引用的object
所使用的存储的指针。
addressOf()
不能和结构variables一起使用:
struct Foo { } var f = Foo() let a = unsafeAddressOf(f) // error: cannot invoke 'unsafeAddressOf' with an argument list of type '(Foo)'
String
是一个struct
, 但是 ,它被自动桥接到NSString
时,传递给一个函数期待一个对象。 所以
let word0 = "hello" let p1 = unsafeAddressOf(word0)
实际执行
let p1 = unsafeAddressOf(word0 as NSString)
您不会得到word0
variables的地址,而是指向桥接的NSString
对象的内存位置的指针。
看起来你不能假设这个桥接是否在同一个Swiftstring上重复执行时返回相同的NSString
对象(或者更一般地说,是同一个Foundation对象)。 在一个游乐场,甚至
let word0 = "hello" let p1 = unsafeAddressOf(word0) let p2 = unsafeAddressOf(word0) let p3 = unsafeAddressOf(word0)
返回三个不同的地址(但编译项目中的地址相同)。 在数组和字典之间的不同桥接中也做了相同的观察(对于数组和字典)。
Swift 3.0 Unmanaged.passUnretained(object).toOpaque()