OC之構造方法

完整地創建一個可用的對象系統需要進行以下兩步:

1.分配存儲空間 +alloc

2.初始化 -init

比如創建一個對象:

Person *p = [Person new];

則系統實際上進行了以下兩步:

    1.調用+alloc分配存儲空間

                  Person *p1 = [Person alloc];

    2.調用-init進行初始化

                                     Person *p2 = [p1 init];

 以上兩步可結合成如下形式,並且在實際開發中也是使用如下形式

                  Person *p = [[Person alloc] init];

上述的init方法就是所謂的構造方法

我們也可以重寫構造方法init

構造方法:用來初始化對象的方法,是個對象方法,-開頭

重寫構造方法的目的:爲了讓對象創建出來,成員變量就會有一些固定的值

重寫構造方法的注意點

1.先調用父類的構造方法([super init]

2.再進行子類內部成員變量的初始化

@implementationPerson

/* 重寫-init方法

- (id)init

{

1.一定要調用回superinit方法:初始化父類中聲明的一些成員變量和其他屬性

self = [super init]; // 當前對象self

2.如果對象初始化成功,纔有必要進行接下來的初始化

    if (self != nil)

    { // 初始化成功

        _age = 10;

    }

    // 3.返回一個已經初始化完畢的對象

    return self;

}*/

- (id)init//id是爲了保證方法可以有任何類型的返回值

{

    if ( self = [super init] )

    { // 初始化成功

        _age = 10;

    }

    // 3.返回一個已經初始化完畢的對象

    return self;

}

@end

【備註】上面代碼提到了super,super與self是有區別的,拿java來比較,self就相當於this,super代表調用父類的方法,比如[super test]代表調用父類中的test方法。

關於初始化構造方法詳解:

比如初始化構造方法,使Person的對象剛剛創建,Person中的成員變量_age就被初始化爲10


當創建一個對象時,如下:

Person*p = [[Person alloc] init];//等價於Person *p = [Person new]

首先調用alloc方法,爲每個成員變量分配空間:

在Person的對象中,有_age變量,默認還有一個變量isa,調用alloc方法後,_age和isa將存在於內存空間中,並且默認情況下他們都有一個初值且初值都爲0。

然後對象就會調用父類中的init方法,父類之後就會去調用NSObject中的init方法,於是所有成員變量就被重新賦值,_age = 0和isa = [Person class]。即對象的成員變量isa將變成一個指向對象父類的指針。而重寫init方法可以給_age重新賦值,可以讓_age等於除0以外的值。

所以在重寫init方法時一定要判斷self = [super init]是否成立,也就是判斷是否成功調用了NSObject中的init方法,只有成功調用init方法後纔可重寫構造方法。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章