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)") }