// A : Parent
@implementation A
-(id) init
{
// change self here then return it
}
@end A
A *a = [[A alloc] init];
a。只是想知道,如果自我是一個局部變量或全球?如果它是本地的,那麼init
中self = [super init]
的點數是多少?我可以成功地定義一些局部變量並像這樣使用,爲什麼我需要將它分配給self
。是超級本地變量嗎?
-(id) init
{
id tmp = [super init];
if(tmp != nil) {
//do stuff
}
return tmp;
}
b。如果[super init]
返回一些其他對象實例,我不得不覆蓋self
,那麼我將無法再訪問A的方法,因爲它將是完全新的對象?我對嗎?
c。 super
和self
指向相同的內存,它們之間的主要區別是方法查找順序。我對嗎?
對不起,沒有Mac的嘗試,學習理論爲現在...
謝謝,但完全沒有回答第一個問題 - 爲什麼我需要'self = [super init]',並且不能使用任何本地變量來完成這項工作。 – Pablo 2010-06-03 02:11:52
@Michael:因爲您需要調用您的超類的初始化程序,並且因爲您的超類的初始化程序(或其超類的初始化程序)可能會返回一個不同的實例;如果你沒有改變自我,那麼你將不會初始化正確的實例,並且你還會將錯誤的實例返回給你的初始者。一個超類的初始化者返回一個不同的實例是非常非常罕見的,所以很多人可以自由決定是否將'[super init]的結果分配給'self',但我個人總是這麼做。這是一種語言的成語。 – dreamlax 2010-06-03 02:17:12
我不明白的是「自我」真正改變的地步。如果'self'是一個參數,那麼它是通過引用傳遞的,所以當我改變它時,原始值也會被改變?否則,如果在返回後發生更改,在'init'之外,當我實例化'A'時,那麼我可以使用'tmp' var來完成它。 – Pablo 2010-06-03 02:23:36