gpt4 book ai didi

objective-c - 在 Objective-C 中打印 &object 和 object 的区别

转载 作者:太空宇宙 更新时间:2023-11-04 00:37:43 28 4
gpt4 key购买 nike

NSLog(@"%p", &object);NSLog(@"%p", object); 有什么区别?

两者似乎都打印出一个内存地址,但我不确定哪个是对象的实际内存地址。

最佳答案

这就是我喜欢的想象方式:

您可以将内存视为一个连续的 strip ,其中包含每个可用 block 的地址。

NSObject *a = nil;
NSObject *b = nil;

b a
v v
+---------+---------+--, ,-+---------+---------+
| | | / / | 0x0 | 0x0 |
+---------+---------+-` `--+---------+---------+
^ ^ ^ ^
0x05aa2 0x05aaa 0x07bf0 0x07bf8

NSLog(@"%p %p", b, &b); //=> 0x0 0x07bf0

我们有两个 NSObject * 类型的局部变量。两者都分配了 nil,因此内容为 0x0。你可以看到这两个变量本身都有一个内存地址0x07bf00x07bf8

然后如果我们创建一个对象的实例并将其放入混合中我们得到

NSObject *a = nil;
NSObject *b = [[NSObject alloc] init];

[NSObject] b a
v v v
+---------+---------+--, ,-+---------+---------+
| | ******* | / / | 0x05aaa | 0x0 |
+---------+---------+-` `--+---------+---------+
^ ^ ^ ^
0x05aa2 0x05aaa 0x07bf0 0x07bf8
^ /
\ /
`--------------'

NSLog(@"%p %p", b, &b); //=> 0x05aaa 0x07bf0

除了现在有 b 指向的 NSObject 实异常(exception),我们声明了与之前相同的局部变量。

由于类型是 NSObject * 我们知道我们有一个指向对象的指针,所以当您执行 NSLog(@"%p", b); 时,您会得到转到内存地址 b 然后在其内容中获取内存地址并跟随它到 NSObject 然后打印它的内存地址的结果。当您执行 &b 时,您实际上只是在执行第一步,并为实际变量 b 请求存储的内存地址。

你应该能够看到这些内存地址是如何相互关联的

关于objective-c - 在 Objective-C 中打印 &object 和 object 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23768453/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com