执行NSLog(@"%p", &object);
和NSLog(@"%p", object);
之间的区别是什么?
两者似乎都打印出一个内存地址,但我不确定哪一个是该对象的实际内存地址。
答案 0 :(得分:3)
这就是我想象的方式:
您可以将内存视为一个连续的条带,其中包含每个可用块的地址。
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
。您可以看到这两个变量本身都有一个内存地址0x07bf0
和0x07bf8
。
然后,如果我们创建一个对象的实例并将其抛入混合中,我们得到
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
我们有与之前声明的相同的局部变量,但现在有NSObject
指向的b
实例。
由于类型为NSObject *
,我们知道我们有一个指向对象的指针,所以当你执行NSLog(@"%p", b);
时,你得到的结果是转到内存地址b
,然后取内存地址在其内容中,然后是NSObject
,然后打印它的内存地址。执行&b
时,您基本上只是执行第一步,并询问实际变量b
的存储空间地址。
您应该能够看到这些内存地址如何相互关联
答案 1 :(得分:2)
指向对象的变量总是在Objective-C中指针,所以我假设object
是一个指针(用%p
标志打印它是没有多大意义的“T)。在第一种情况下,您将获得内存中指针所在的地址;在第二个中,对象本身在内存中的位置。
答案 2 :(得分:2)
正确用法为NSLog(@"%p", object)
。我举了一个例子:
NSObject *object = nil;
NSLog(@"%p", &object); // prints 0x7fff535d7bf8
NSLog(@"%p", object); // prints 0x0
由此,您可以清楚地看到后者是您想要的那个。
答案 3 :(得分:0)
它在C中的含义相同。&object
是指向对象变量的指针。 object
(可能)是指向其他内容的指针,但它通常是object
变量的内容。