我想了解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的人可能會偶然發現這個問題並且感到奇怪。但是,只是我的意見,爲什麼我將推理作爲評論而不是編輯或其他答案。 :) –