Objective-C中打印与对象和对象之间的区别

时间:2014-05-20 19:37:02

标签: objective-c c

执行NSLog(@"%p", &object);NSLog(@"%p", object);之间的区别是什么?

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

4 个答案:

答案 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。您可以看到这两个变量本身都有一个内存地址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

我们有与之前声明的相同的局部变量,但现在有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变量的内容。