【问题标题】:Which address &self point to?&self 指向哪个地址?
【发布时间】:2017-04-26 03:26:08
【问题描述】:

我试图了解 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 总是指向同一个地址?

【问题讨论】:

    标签: objective-c pointers self


    【解决方案1】:

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

    &self -> self -> object
    

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

    要打印出self指向的地址,只需删除&即可。

    【讨论】:

    • 应该注意到,在这种情况下甚至发生这种情况的原因是它在堆栈上获取self 的地址-print 的执行中我>。调用-print 将一个新的栈帧压入栈中,self 被放置在栈顶。 &self != &a != &b; ab 位于不同的堆栈位置,但 self 甚至与这些位置是分开的。如果您从不同的函数内部调用-print&self 仍然会有所不同
    • 我不知道是否值得注意,如果 OP 根本不想这样做,为什么会以特定方式发生某些事情。 ;-)
    • 当然,但为了教育起见......不是OP的人可能会偶然发现这个问题并想知道。但是,这只是我的意见以及为什么我将推理作为评论而不是编辑或其他答案。 :)
    • 编辑显然会与作者的意图相冲突。 (我认识他,因为我每天都刮他的脸。);-) 但是,当然,你是对的:有人可能有这个额外的问题。
    【解决方案2】:

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

    在您的示例中,您从同一个函数紧接着进行的两次调用碰巧打印了相同的内容,因为每次调用都会在(相同)当前堆栈帧的顶部放置一个新堆栈帧,并且-print的栈帧中的局部变量self是固定的,所以位置是一样的。

    【讨论】:

      猜你喜欢
      • 2011-08-31
      • 2013-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多