【发布时间】:2015-09-17 19:54:37
【问题描述】:
关于 Swift 如何管理 String(s) 的内存地址,我有些不明白
1。引用类型
这里foo 和boo 是两个指向相同内存位置的指针。
class Foo { }
let foo = Foo()
let boo = foo
unsafeAddressOf(foo) // "UnsafePointer(0x7FCD13719BE0)"
unsafeAddressOf(boo) // "UnsafePointer(0x7FCD13719BE0)"
很好。
2。值类型
let word0 = "hello"
let word1 = word0
现在word0 和word1 是value 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)"
3。更多
还请注意,String 是 struct 即 somehow conforms 到 AnyObject。
使用 Xcode 7 GM Playground 和 Swift 2.0 测试。
【问题讨论】:
-
"那么为什么它们有 2 个不同的内存地址?"那你为什么在乎呢?
-
String 在传递给期望 AnyObject 的函数时会自动桥接到 NSObject,另请参阅我对 stackoverflow.com/questions/32637688/… 的评论。实际上,我在编译的项目中得到了 word0/1 的相同输出,但在 Playground 中得到了不同的输出。
-
@matt Ahah...:D 是的。我开始想同样的事情。但是stackoverflow.com/questions/32626383/…这个问题和我回答下面cmets的激烈交流促使我问了这个问题。
-
这里有类似的观察:stackoverflow.com/questions/31298461/…。我认为您不能对自动桥接到 Foundation 对象是否每次都返回相同的实例做出任何假设。
-
@MartinR:理解。十分感谢。如果你想写你的 cmets 作为答案,请考虑接受它。
标签: string swift memory-address value-type