我正在尝试理解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
始终指向同一地址?
答案 0 :(得分:2)
self
指向收到邮件的对象。但是你不打印self
。您打印&self
什么是指针到 self
,而不是self
的指针。
&self -> self -> object
由于self
以静默方式传递给每个方法,因此您只需在堆栈上打印出参数的地址,无论实例或类型self
指向何种情况,都会在您的情况下始终相同。
要打印出self
指向的地址,只需删除&
。
答案 1 :(得分:1)
在每种方法中,self
都是隐藏参数。函数的参数是局部变量,因此-print
只是在自己的特定调用中打印自己的局部变量的地址。它与调用它的对象无关。
你在示例中的同一个函数之后发出的两个调用碰巧打印相同的东西,因为每次调用都会在(相同的)当前堆栈帧的顶部放置一个新的堆栈帧,并且self
堆栈框架中的局部变量-print
是固定的,因此位置将是相同的。