ios swift struct swift2 swift2.2

ios - ¿Cómo puedo obtener la dirección de memoria de un tipo de valor o una estructura personalizada en Swift?



swift2 swift2.2 (3)

Estoy tratando de obtener una comprensión más profunda de cómo Swift copia los tipos de valor :

El comportamiento que ve en su código siempre será como si tuviera lugar una copia. Sin embargo, Swift solo realiza una copia real detrás de las escenas cuando es absolutamente necesario hacerlo.

Para avanzar en mi comprensión, me gustaría obtener la dirección de memoria de un tipo de valor. Intenté unssafeAddressOf (), pero esto no funciona con structs y parece convertir los tipos de biblioteca estándar de Swift en tipos de referencia (por ejemplo, String se convierte en NSString).

¿Cómo puedo obtener la dirección de memoria de un tipo de valor, como una instancia de Int, o una estructura personalizada en Swift?


De acuerdo con la respuesta de Martin R.

addressOf () no se puede usar con variables struct. String es una estructura, sin embargo, se puentea automáticamente a NSString cuando se pasa a una función que espera un objeto.

De acuerdo con la respuesta de nschum, puede obtener la dirección (pila) de una estructura , tipo de construcción incorporado o referencia de objeto como esta:

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"

Una cosa que encontré es que si myStruct no tiene valor, la dirección se mantendrá igual:

struct myStruct { } var struct1 = myStruct() var struct2 = struct1 print(NSString(format: "%p", address(&struct1))) // -> ""0xa000000000070252/n"" print(NSString(format: "%p", address(&struct2))) // -> ""0xa000000000070252/n""


No estoy seguro de si hay una forma "recomendada" de hacerlo, pero un método es usar withUnsafePointer(_:_:) , así:

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

Esto imprimió 0x00007ffff52a011c8 en mi máquina.


Swift 2.0:

Puedes usar este unsafeAddressOf(someObject)

o en Swift 3.0:

use withUnsafePointer(to: someObejct) { print("/($0)") }