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

前端之家收集整理的这篇文章主要介绍了ios – 如何在Swift中获取值类型或自定义结构的内存地址?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在努力深入了解 Swift copies value types

The behavior you see in your code will always be as if a copy took
place. However,Swift only performs an actual copy behind the scenes
when it is absolutely necessary to do so.

为了提高我的理解,我想得到一个值类型的内存地址.我尝试了unsafeAddressOf(),但是this doesn’t work with structs and it seems to cast Swift’s standard library types to reference types(例如String被强制转换为NSString).

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

解决方法

根据马丁R的回答

addressOf() cannot be used with struct variables. String is a struct,however,it is automatically bridged to NSString when passed to a function expecting an object.

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

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"

我发现的一件事是,如果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""

猜你在找的iOS相关文章