Objective c 哪个地址&;自我指向?

Objective c 哪个地址&;自我指向?,objective-c,pointers,self,Objective C,Pointers,Self,我试图理解Objective-C运行时,但不知道self指针指向哪里。我写了一个例子来检查&self将显示什么。我创建了ClassA,如下所示: @implementation ClassA -(void) print { NSLog(@"Class A &self is: %p", &self); } @end 然后我在main()创建了A的两个实例,并调用printf()将其打印出来: ClassA *firstInstance = [ClassA

我试图理解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
当我使用以下代码创建第二个类时,情况更糟:

@implementation ClassA
-(void) print {
    NSLog(@"Class B &self is: %p", &self);
}
@end
我在
&self
上得到了相同的地址

Class B &self is: 0x7fff5bacf4e8
&self -> self -> object

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

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

Class B &self is: 0x7fff5bacf4e8
&self -> self -> object
由于
self
以静默方式传递给每个方法,因此您只需在堆栈上打印参数的地址,无论
self
指向哪个实例或类型,该地址在您的情况下都是相同的


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

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


在您的示例中,您从同一个函数紧接着进行的两个调用恰好打印出相同的内容,因为每个调用将在(相同的)当前堆栈帧上放置一个新的堆栈帧,并且局部变量
self
-print
的堆栈帧中的位置是固定的,因此位置将是相同的。

应该注意的是,在这种情况下发生这种情况的原因是它将
self
的地址作为执行
-print
时堆栈上的地址。调用
-print
将一个新的堆栈框架推到堆栈上,并将
self
放置在其顶部<代码>&self!=&a!=&b
a
b
位于不同的堆栈位置,但是
self
甚至与它们分开。如果您从不同的函数内部调用了
-print
&self
则会有所不同,但我不知道是否值得注意,如果OP根本不想这样做,为什么会以特定的方式发生某些事情。;-)当然,但是为了教育的缘故。。。不是OP的人可能会偶然发现这个问题并感到惊讶。但是,只有我的意见和我为什么把理由作为评论而不是编辑或其他答案编辑显然与作者的意图相冲突。(我认识他,因为我每天都给他刮脸。);-)但是,当然,你是对的:有些人可能有这个额外的问题。