&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
的位置是固定的,因此位置将相同。
我正在尝试了解 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
的位置是固定的,因此位置将相同。