Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在Swift中获取值类型或自定义结构的内存地址?_Ios_Swift_Struct_Swift2_Swift2.2 - Fatal编程技术网

Ios 如何在Swift中获取值类型或自定义结构的内存地址?

Ios 如何在Swift中获取值类型或自定义结构的内存地址?,ios,swift,struct,swift2,swift2.2,Ios,Swift,Struct,Swift2,Swift2.2,我试图更深入地了解Swift: 您在代码中看到的行为将始终像复制一样 地点。但是,Swift仅在幕后执行实际复制 在绝对必要的情况下 为了加深我的理解,我想得到一个值类型的内存地址。我尝试了unsafeAddressOf(),但是(例如字符串被转换为NSString) 如何获取值类型的内存地址,如Int实例或Swift中的自定义结构?我不确定是否有“推荐”的方法,但有一种方法是使用和unsafepointer(::),如下所示: var s: String = "foo" withUnsafeP

我试图更深入地了解Swift:

您在代码中看到的行为将始终像复制一样 地点。但是,Swift仅在幕后执行实际复制 在绝对必要的情况下

为了加深我的理解,我想得到一个值类型的内存地址。我尝试了unsafeAddressOf(),但是(例如字符串被转换为NSString)

如何获取值类型的内存地址,如Int实例或Swift中的自定义结构?

我不确定是否有“推荐”的方法,但有一种方法是使用
和unsafepointer(::)
,如下所示:

var s: String = "foo"
withUnsafePointer(&s) { NSLog("\($0)") }
import UIKit


func address(o: UnsafePointer<Void>) -> Int {
    return unsafeBitCast(o, Int.self)
}

func addressHeap<T: AnyObject>(o: T) -> Int {
    return unsafeBitCast(o, Int.self)
}


struct myStruct {
    var a: Int
}

class myClas {

}
//struct
var struct1 = myStruct(a: 5)
var struct2 = struct1
print(NSString(format: "%p", address(&struct1))) // -> "0x10f1fd430\n"
print(NSString(format: "%p", address(&struct2))) // -> "0x10f1fd438\n"

//String
var s = "A String"
var aa = s
print(NSString(format: "%p", address(&s))) // -> "0x10f43a430\n"
print(NSString(format: "%p", address(&aa))) // -> "0x10f43a448\n"

//Class
var class1 = myClas()
var class2 = class1
print(NSString(format: "%p", addressHeap(class1))) // -> 0x7fd5c8700970
print(NSString(format: "%p", addressHeap(class2))) // -> 0x7fd5c8700970

unsafeAddressOf(class1) //"UnsafePointer(0x7FD95AE272E0)"
unsafeAddressOf(class2) //"UnsafePointer(0x7FD95AE272E0)"

//Int
var num1 = 55
var num2 = num1
print(NSString(format: "%p", address(&num1))) // -> "0x10f1fd480\n"
print(NSString(format: "%p", address(&num2))) // -> "0x10f1fd488\n"

这是在我的机器上打印的
0x00007ffff52a011c8

根据Martin R的回答

addressOf()不能与结构变量一起使用。String是一个结构,但是,当传递给需要对象的函数时,它会自动桥接到NSString

根据nschum的回答,您可以获得结构、内置类型或对象引用的(堆栈)地址,如下所示:

var s: String = "foo"
withUnsafePointer(&s) { NSLog("\($0)") }
import UIKit


func address(o: UnsafePointer<Void>) -> Int {
    return unsafeBitCast(o, Int.self)
}

func addressHeap<T: AnyObject>(o: T) -> Int {
    return unsafeBitCast(o, Int.self)
}


struct myStruct {
    var a: Int
}

class myClas {

}
//struct
var struct1 = myStruct(a: 5)
var struct2 = struct1
print(NSString(format: "%p", address(&struct1))) // -> "0x10f1fd430\n"
print(NSString(format: "%p", address(&struct2))) // -> "0x10f1fd438\n"

//String
var s = "A String"
var aa = s
print(NSString(format: "%p", address(&s))) // -> "0x10f43a430\n"
print(NSString(format: "%p", address(&aa))) // -> "0x10f43a448\n"

//Class
var class1 = myClas()
var class2 = class1
print(NSString(format: "%p", addressHeap(class1))) // -> 0x7fd5c8700970
print(NSString(format: "%p", addressHeap(class2))) // -> 0x7fd5c8700970

unsafeAddressOf(class1) //"UnsafePointer(0x7FD95AE272E0)"
unsafeAddressOf(class2) //"UnsafePointer(0x7FD95AE272E0)"

//Int
var num1 = 55
var num2 = num1
print(NSString(format: "%p", address(&num1))) // -> "0x10f1fd480\n"
print(NSString(format: "%p", address(&num2))) // -> "0x10f1fd488\n"
Swift 2.0:

您可以使用此
unsafeAddressOf(someObject)

或在Swift 3.0中:


使用
和unsafepointer(指向:someObejct){print(\($0)”)}

这样就证明了Swift不会对自定义结构实现写时复制优化,只对少数内置类型和类。有趣。@karansatia类是引用类型,所以赋值时不会复制它们。如果将类实例指定给另一个对象,它们将指向同一个对象。因此,在上面的示例中,两个类的地址相同是正常的。这与书面副本无关。无论它们是内置类还是自定义类,都是如此。必须实现NSCopying以使类可克隆,并按如下方式分配:b=a.copy()as?MyClass而不是b=aSwift 4.2:withUnsafePointer(指向:&s,{NSLog(($0)”)}@jreft56您是对的,Swift 5.2也一样