2017-04-26 43 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是固定的,因此位置將是相同的。