我想了解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
总是指向相同的地址?
应该注意的是,在这种情况下甚至发生这种情况的原因是,它在执行'-print'_时将'self'的地址作为堆栈。调用'-print'会将一个新的堆栈框架压入堆栈,'self'放置在堆栈顶部。 '&self!=&a!= &b';'a'和'b'处于不同的堆栈位置,但是'self'与这些位置是分开的。如果你从一个不同的函数里调用'-print','&self'会有所不同 –
我不知道,是否值得注意,为什么某些事情会以某种特定的方式发生,如果OP不想这样做在所有。 ;-) –
当然,但为了教育的缘故......不是OP的人可能会偶然发现这个问题并且感到奇怪。但是,只是我的意见,为什么我将推理作为评论而不是编辑或其他答案。 :) –