Swift,string和内存地址

有什么我不理解如何Swiftpipe理String(s)内存地址String(s)

1.引用types

这里fooboo是指向相同内存位置的 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 

现在word0word1value 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是一个符合 AnyObjectstruct

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) 

您不会得到word0variables的地址,而是指向桥接的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()