当前位置: 首页 > 面试题库 >

Swift,字符串和内存地址

贡斌
2023-03-14
问题内容

关于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

现在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.更多

另请注意,Stringstruct那个莫名其妙符合到AnyObject

经过Xcode 7 GM Playground和Swift 2.0的测试。


问题答案:

func unsafeAddressOf(object: AnyObject) -> UnsafePointer

接受AnyObject参数,即 class 的实例。它将指针返回到用于引用的对象的存储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字符串上重复执行此桥接是否返回相同的对象(或更笼统地说,相同的Foundation对象)做出任何假设。在操场上,甚至

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

返回三个不同的地址(但在已编译项目中为相同的地址)。在Array和Dictionary之间的不同桥接中,进行了相同的观察(对于数组和字典)。



 类似资料:
  • Swift 4中的字符串是一个有序的字符集合,例如。 它们由Swift 4数据类型表示,也是由字符类型值的集合来表示。 1. 创建字符串 可以使用字符串文字或创建类的实例来创建字符串,如下所示 - 编译并执行上述代码时,会产生以下结果 - 2. 空字符串 可以通过使用空字符串文字或创建类的实例来创建空字符串,如下所示。还可以使用布尔属性检查字符串是否为空。参考以下示例代码 - 编译并执行上述代码时

  • Swift 字符串是一系列字符的集合。例如 "Hello, World!" 这样的有序的字符类型的值的集合,它的数据类型为 String。 创建字符串 你可以通过使用字符串字面量或 String 类的实例来创建一个字符串: import Cocoa // 使用字符串字面量 var stringA = "Hello, World!" print( stringA ) // String 实例化

  • 我读过很多关于创建字符串时内存分配的相互矛盾的文章。一些文章说new operator在堆中创建一个字符串,String literal在String Pool[heap]中创建,而一些文章说new operator在堆中创建一个对象,在String Pool中创建另一个对象。 为了分析这一点,我写了下面的程序,打印字符串字符数组和字符串对象的hashcode: 此程序打印以下输出: 从这个输出中

  • 我有一种情况,我试图对一些数据进行二进制解码,数据类型既有数值,也有字符串值和名称。我正在考虑使用枚举,例如: 然而,我也知道: 或者举另一个例子: 是否有一种方法可以将此结构重构为枚举,以便我用整数值构造枚举,但我将枚举“读”为字符串?我很确定答案是否定的。

  • 从这里可以清楚地看到,在Java中组成

  • 问题内容: 我在Firebase中有一个数据库,该数据库将有单独的用户节点。在每个用户的节点中将是与他们有关的数据,并且将是私有的。除此之外,我还想创建一个仅包含已注册电子邮件集合的节点。原因是当用户使用“登录VC”并输入电子邮件时。如果电子邮件已注册,则图像视图将变为绿色。但是,如果电子邮件不在数据库中(或与电子邮件地址格式不匹配),该图像将为红色。 我先前的问题的先前答案表明我需要更改“。”。