哪个地址和自我指向?

时间:2017-04-26 03:26:09

标签: objective-c pointers self

我正在尝试理解Objective-C运行时并且没有弄清楚,self指针指向哪里。我写了一个例子来检查&self将显示的内容。我已创建ClassA,如下所示:

@implementation ClassA
   -(void) print {
       NSLog(@"Class A &self is: %p", &self);
   }
@end

然后我在A创建了两个main()的实例,并调用printf()将其打印出来:

ClassA *firstInstance = [ClassA new];
[firstInstance print];

ClassA *secondInstance = [ClassA new];
[secondInstance print];

我得到两个实例的相同地址:

Class A &self is: 0x7fff5bacf4e8
Class A &self is: 0x7fff5bacf4e8

当我使用以下代码创建第二个类时更是如此:

@implementation ClassA
-(void) print {
    NSLog(@"Class B &self is: %p", &self);
}
@end

我在&self获得相同的地址。

Class B &self is: 0x7fff5bacf4e8

为什么&self始终指向同一地址?

2 个答案:

答案 0 :(得分:2)

self指向收到邮件的对象。但是你不打印self。您打印&self什么是指针 self,而不是self的指针。

&self -> self -> object

由于self以静默方式传递给每个方法,因此您只需在堆栈上打印出参数的地址,无论实例或类型self指向何种情况,都会在您的情况下始终相同。

要打印出self指向的地址,只需删除&

答案 1 :(得分:1)

在每种方法中,self都是隐藏参数。函数的参数是局部变量,因此-print只是在自己的特定调用中打印自己的局部变量的地址。它与调用它的对象无关。

你在示例中的同一个函数之后发出的两个调用碰巧打印相同的东西,因为每次调用都会在(相同的)当前堆栈帧的顶部放置一个新的堆栈帧,并且self堆栈框架中的局部变量-print是固定的,因此位置将是相同的。