Swift,Strings和Memory地址

时间:2015-09-17 19:54:38

标签: string swift memory-address value-type

我不了解Swift如何管理String(s)

的内存地址

1。参考类型

此处fooboo是指向相同内存位置的2个指针。

class Foo { }

let foo = Foo()
let boo = foo

unsafeAddressOf(foo) // "UnsafePointer(0x7FCD13719BE0)"
unsafeAddressOf(boo) // "UnsafePointer(0x7FCD13719BE0)" 

好。

2。值类型

let word0 = "hello"
let word1 = word0

现在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

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

unsafeAddressOf(word0) // "UnsafePointer(0x7FCD1342ACE0)"
unsafeAddressOf(word1) // "UnsafePointer(0x7FCD13414260)"

3。更

另请注意,Stringstruct somehow conformsAnyObject

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

2 个答案:

答案 0 :(得分:12)

func unsafeAddressOf(object: AnyObject) -> UnsafePointer<Void>

采用AnyObject参数,即的实例。 它返回指向用于引用对象的存储的指针 object

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

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

Stringstruct但是,当传递给期望对象的函数时,它会自动桥接到NSString。所以

let word0 = "hello"
let p1 = unsafeAddressOf(word0)

实际执行

let p1 = unsafeAddressOf(word0 as NSString)

你得到的不是word0变量的地址,而是指向的变量 桥接NSString对象的内存位置。

似乎你无法对这种过渡做出任何假设 返回相同的NSString对象(或更一般地,相同 基础对象)在同一个Swift字符串上重复完成。在游乐场,甚至

let word0 = "hello"
let p1 = unsafeAddressOf(word0)
let p2 = unsafeAddressOf(word0)
let p3 = unsafeAddressOf(word0)

返回三个不同的地址(但编译时的地址相同) 项目)。进行了相同的观察(对于数组和字典) 在A different bridging between Array and Dictionary

答案 1 :(得分:0)

Swift 3.0 Unmanaged.passUnretained(对象).toOpaque()