Swift,Strings和Memory地址

Luc*_*tti 12 string value-type memory-address swift

有一些我不了解Swift如何管理内存地址 String(s)

1.参考类型

这里fooboo是2个指针指向相同的内存位置.

class Foo { }

let foo = Foo()
let boo = foo

unsafeAddressOf(foo) // "UnsafePointer(0x7FCD13719BE0)"
unsafeAddressOf(boo) // "UnsafePointer(0x7FCD13719BE0)" 
Run Code Online (Sandbox Code Playgroud)

好.

2.价值类型

let word0 = "hello"
let word1 = word0
Run Code Online (Sandbox Code Playgroud)

现在,word0word1value types但这里的copy on write机制是参与.

[...]但是,当绝对必要时,Swift仅在幕后执行实际复制.Swift管理所有值复制以确保最佳性能,您不应该避免分配以尝试抢占此优化.https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/ClassesAndStructures.html#//apple_ref/doc/uid/TP40014097-CH13-XID_134

那他们为什么有2个不同的内存地址呢?

unsafeAddressOf(word0) // "UnsafePointer(0x7FCD1342ACE0)"
unsafeAddressOf(word1) // "UnsafePointer(0x7FCD13414260)"
Run Code Online (Sandbox Code Playgroud)

3.更多

同时请注意,Stringstruct那个莫名其妙符合AnyObject.

使用Xcode 7 GM Playground和Swift 2.0进行测试.

Mar*_*n R 12

func unsafeAddressOf(object: AnyObject) -> UnsafePointer<Void>
Run Code Online (Sandbox Code Playgroud)

接受一个AnyObject参数,即一个的实例.它返回指向用于引用的对象的存储的指针object.

addressOf()不能与struct变量一起使用:

struct Foo { }
var f = Foo()
let a = unsafeAddressOf(f)
// error: cannot invoke 'unsafeAddressOf' with an argument list of type '(Foo)'
Run Code Online (Sandbox Code Playgroud)

String是一个struct,然而,它会自动桥接到NSString时传递给需要的对象的函数.所以

let word0 = "hello"
let p1 = unsafeAddressOf(word0)
Run Code Online (Sandbox Code Playgroud)

实际执行

let p1 = unsafeAddressOf(word0 as NSString)
Run Code Online (Sandbox Code Playgroud)

您不是word0变量的地址,而是指向桥接NSString对象的内存位置的指针.

看起来你不能对这个桥接NSString在同一个Swift字符串上重复完成时是否返回相同的对象(或更一般地说,同一个Foundation对象)做出任何假设.在游乐场,甚至

let word0 = "hello"
let p1 = unsafeAddressOf(word0)
let p2 = unsafeAddressOf(word0)
let p3 = unsafeAddressOf(word0)
Run Code Online (Sandbox Code Playgroud)

返回三个不同的地址(但编译项目中的地址相同).在阵列和字典之间的不同桥接中进行了相同的观察(对于数组和字典).