2017-04-26 45 views
1

我想了解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总是指向相同的地址?

回答

2

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

&self -> self -> object 

由于self默默地传递到每一个方法,只需打印出参数的地址栈,它总是在你的情况相同,与实例或键入self点。

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

+1

应该注意的是,在这种情况下甚至发生这种情况的原因是,它在执行'-print'_时将'self'的地址作为堆栈。调用'-print'会将一个新的堆栈框架压入堆栈,'self'放置在堆栈顶部。 '&self!=&a!= &b';'a'和'b'处于不同的堆栈位置,但是'self'与这些位置是分开的。如果你从一个不同的函数里调用'-print','&self'会有所不同 –

+0

我不知道,是否值得注意,为什么某些事情会以某种特定的方式发生,如果OP不想这样做在所有。 ;-) –

+0

当然,但为了教育的缘故......不是OP的人可能会偶然发现这个问题并且感到奇怪。但是,只是我的意见,为什么我将推理作为评论而不是编辑或其他答案。 :) –

1

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

在你的例子中,你从同一个函数中相互调用的两个调用碰巧会打印同一个东西,因为每个调用都会在当前堆栈帧的顶部放置一个新的堆栈帧, -print的堆栈帧中的局部变量self是固定的,因此位置将是相同的。