Laut Martin R‘s Antwort
AddressOf() kann nicht mit struct Variablen verwendet werden. String ist eine Struktur, wird jedoch automatisch an NSString überbrückt, wenn sie an eine Funktion übergeben wird, die ein Objekt erwartet.
Nach nschum Antwort, können Sie den (Stack) Adresse eines struct erhalten, build-in-Typ oder Objektverweis wie folgt aus:
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"
Eine Sache, die ich gefunden, wenn myStruct
struct myStruct {
}
var struct1 = myStruct()
var struct2 = struct1
print(NSString(format: "%p", address(&struct1))) // -> ""0xa000000000070252\n""
print(NSString(format: "%p", address(&struct2))) // -> ""0xa000000000070252\n""
So beweist dies, dass Swift nicht copy-on-write Optimierung gebaut für individuelle Structs, nur für ein paar nicht implementiert in Arten und Klassen. Interessant. –
@karansatia Klassen sind Referenztypen und werden bei der Zuweisung nicht kopiert. Wenn Sie einem anderen Objekt eine Klasseninstanz zuweisen, zeigen sie auf dasselbe Objekt. Daher ist es normal, dass wir im obigen Beispiel für beide Klassen die gleiche Adresse haben. Es hat nichts mit dem Copy-on-Write zu tun. Dies gilt unabhängig davon, ob es sich um integrierte oder benutzerdefinierte Klassen handelt. Sie müssen NSCopying implementieren, um Ihre Klasse klonbar zu machen, und sie folgendermaßen zuweisen: b = a.copy() as? MyClass eher als b = a –