&self 指向哪个地址?

Which address &self point to?

我正在尝试了解 Objective-C 运行时但不明白 self 指针指向何处。我写了一个例子来检查 &self 会显示什么。我创建了 ClassA,如下所示:

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

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

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

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

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

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

当我使用以下代码创建第二个 class 时甚至更多:

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

我在 &self 得到了相同的地址。

Class B &self is: 0x7fff5bacf4e8

为什么 &self 总是指向同一个地址?

self 指向接收消息的对象。但是你不打印self。你打印 &self 什么是 self 的指针,而不是 self.

的指针
&self -> self -> object

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

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

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

在你的例子中,你从同一个函数中紧接着进行的两次调用恰好打印了同样的东西,因为每次调用都会在(相同的)当前堆栈帧之上放置一个新的堆栈帧,并且位置-print 的堆栈帧中的局部变量 self 的位置是固定的,因此位置将相同。