2015-02-07 99 views
2
- (id)init { 
    self = [super init]; 

    if (self) { 
     // initialize instance variables here 
    } 

    return self; 
} 

讀過蘋果的文檔後,我仍然被上面的困惑。我熟悉其他語言的selfthis的概念,但在此我們將self分配給超類init self = [super init];,然後檢查是否返回nil。但是,我們在最後一行迴歸自我。我的意思是,通常返回self的意思是「我正在歸還我自己」,但由於我們之前分配了selfsuper init,是不是我們將super歸爲self而不是ourselves歸爲self在objective-c init方法中返回什麼「自我」?

編輯 - 我試圖儘可能清楚以上,但在句子中使用自我是棘手。希望有人能幫忙。

回答

0

不!

每個初始化程序必須調用[super init]。這意味着您在示例中調用的超級初始化程序的功能相同。

所有這些初始化程序都可以根據需要準備對象,以便在類繼承描述它時最終可以使用它。他們都在同一個對象上工作。 (這是OO的一個目標,一個對象可以完成其所有(超級)類所描述的任何事情,所以所有(超級)類都必須初始化該對象。)

self無非是一個指向對象的指針/目前正在研究。它沒有像「我回歸自己」這樣的特殊含義。

請注意,沒有init方法分配對象。這與[AClass alloc]完成。

+0

啊,我現在得到它。感謝idmean和micheal welch。因此,self是調用這些繼承的inits的對象,即使inits屬於父類,並且這些繼承的inits將調用對象(需要初始化的子對象)稱爲self。得到它了! – 2015-02-07 20:31:44

0

self與Java或C#中的this相同。

self = [super init]; 

被允許父類做的初始化第一。如果一切都好(換句話說,self != nil),那麼我們可以做任何我們需要做的初始化。

最後我們返回self

您必須記住,selfourselves正如您所描述的,它由父類和此類完成的初始化組成。

更新

這個類和父類需要進行合作,以初始化self。我們需要通過調用[super init]來給父母班級第一槍。完成後,它會返回一個我們稱爲self的對象。然後我們用這個子類定義的實例變量的值進一步初始化self。但是兩個初始化器都在處理同一個對象。

+1

還分配和初始化,和類簇之間的差扎入這一點。 – Wain 2015-02-07 20:23:33

+0

我不明白的是,當父母迴歸自我時,他們會迴歸自我。但是當我們返回自我時,我們也返回父對象,因爲我們在自我= [超級初始化]時將自己指定給父對象。沒有? – 2015-02-07 20:24:32

+0

@是的,這是正確的。這張海報似乎很困惑,並認爲父類正在創建一個對象,並且此類正在創建一個不同的對象,並且我們正在返回父對象而不是此對象。我主要是想指出,父init和這個init都在初始化同一個對象。 – 2015-02-07 20:25:39

0

讓我把這個以外行人的語言。

在學習面向對象編程時,您一定已經閱讀過有關Cars和一個Prius如何成爲Car的對象。 你基本上有一個超Car使所有汽車繼承,像普銳斯,福克斯等。對於普銳斯是一輛車,在面向對象的術語,繼承,普銳斯必須首先從Car繼承,然後添加普銳斯的具體屬性/屬性。

同樣的方式,每次你在Objective-C(和幾乎每一個面向對象的編程語言)使類,你必須首先從父類繼承。根類是NSObject(objective-c)。

[super init]初始化父類,所有它的屬性。在成功之後,您可以添加自己的屬性/屬性,這些屬性是特定於您的課程的。

一個常見的例子是當您覆蓋UITableViewCell的子類時覆蓋init方法。

- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { 

    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; 

    if (self) { 

     UIImageView* imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Foo"]]; 
     imageView.frame = CGRectMake(0, 0, 100, 50); 
     [self.contentView addSubview:imageView]; 
    } 

    return self; 
} 

這裏,initWithStyle:reuseIdentifier:被覆蓋。它首先調用[super initWithStyle:style reuseIdentifier:reuseIdentifier]。這會初始化一個默認的UITableViewCell,其中stylereuseIdentifier提供給它。您可以在此訪問UITableViewCell的所有房產。另外,imageView被添加到單元格中,該單元格只針對該單元格。

Object Initialization文件是真的好,以幫助理解這一點。

相關問題