Swift 打印局部常量变量的内存地址
我有一个非常简单的客户类类型,名为Dog,它只包含一个字符串类型的变量。可以更改Dog类型实例值的函数定义如下 问题: d是函数中定义的局部变量,我尝试了withUnsafePointer,似乎它需要inout参数或至少一个可变变量(var),我想知道是否有办法打印出局部变量的内存地址dSwift 打印局部常量变量的内存地址,swift,function,memory-address,Swift,Function,Memory Address,我有一个非常简单的客户类类型,名为Dog,它只包含一个字符串类型的变量。可以更改Dog类型实例值的函数定义如下 问题: d是函数中定义的局部变量,我尝试了withUnsafePointer,似乎它需要inout参数或至少一个可变变量(var),我想知道是否有办法打印出局部变量的内存地址d class Dog { var name: String = "Fido" } func dogChanger(_ d: Dog) { d.name = "Rover" withUns
class Dog {
var name: String = "Fido"
}
func dogChanger(_ d: Dog) {
d.name = "Rover"
withUnsafePointer(&d) { NSLog("\($0)") } //d needs to be a inout parameter
}
感谢您在Swift中提供的时间和帮助,因为这是一个类的实例,将
var
变量分配给Dog
的d
实例将不会复制它,因此您对该指针所做的任何更改都将反映在初始值中。遵守以下规定:
class Dog {
var name: String = "Fido"
}
func dogChanger(_ d: Dog) {
d.name = "Rover"
var x = d
// 1
print(d.name)
x.name = "Changed1"
// 2
print(d.name)
withUnsafePointer(to: &x) {
$0.pointee.name = "Changed2";
// 3
print("\($0)")
}
// 4
print(d.name)
}
var d = Dog()
dogChanger(d)
//5
print(d.name)
Rover
Changed1
0x00007fff5dd49200
Changed2
Changed2
在我的机器上,这会输出以下内容:
class Dog {
var name: String = "Fido"
}
func dogChanger(_ d: Dog) {
d.name = "Rover"
var x = d
// 1
print(d.name)
x.name = "Changed1"
// 2
print(d.name)
withUnsafePointer(to: &x) {
$0.pointee.name = "Changed2";
// 3
print("\($0)")
}
// 4
print(d.name)
}
var d = Dog()
dogChanger(d)
//5
print(d.name)
Rover
Changed1
0x00007fff5dd49200
Changed2
Changed2
如您所见,在print语句1中,我们直接在d
上更改了名称,然后记录了名称。在第二个示例中,我们看到当我们更改变量x
的名称时,d
的名称发生了更改。在第三条语句中,我们得到x
的地址。在第四个语句中,我们看到更改x
指向的对象的名称更改了d
的名称,最后在最后一个语句中,我们看到我们传入的Dog
实例的最终名称以这种方式更改。这告诉我们d
和x
指向同一个对象
记住,;但是,该类实例仅保证在执行
dogChanger
函数时存在,因此不允许该指针转义该函数。请尝试let dog=d
,然后使用dog
。感谢您的帮助。我相信我没有很好地解释我的问题。通过创建一个x(var),它在堆栈中创建一个新的内存块,与前一个内存块(即d(let))结合使用,其中两个堆栈块包含引用堆中相同对象的相同“指针”,但这两个堆栈块有自己的堆栈地址。我认为0x00007fff5dd49200是x的堆栈地址,但我对d的堆栈地址感兴趣,这可以在函数内部打印吗?再次感谢。