完整地建立一個可用的對象系統須要進行如下兩步:java
1.分配存儲空間 +allocthis
2.初始化 -initspa
好比建立一個對象:.net
Person *p = [Person new]; 指針
則系統實際上進行了如下兩步:對象
1.調用+alloc分配存儲空間內存
Person *p1 = [Person alloc];開發
2.調用-init進行初始化get
Person *p2 = [p1 init];it
以上兩步可結合成以下形式,而且在實際開發中也是使用以下形式:
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] )
{ // 初始化成功
_age = 10;
}
// 3.返回一個已經初始化完畢的對象
return self;
}
【備註】上面代碼提到了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方法後纔可重寫構造方法。