天天看點

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.一定要調用回super的init方法:初始化父類中聲明的一些成員變量和其他屬性

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

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

    if (self != nil)

    { // 初始化成功

        _age = 10;

    }

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

    return self;

}*/

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

    if ( self = [super init] )

    { // 初始化成功

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

}

<a href="http://my.oschina.net/u/567204" target="_blank">@end</a>

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

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

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

OC之構造方法

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

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方法後才可重寫構造方法。