完整地創建一個可用的對象系統需要進行以下兩步:
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] )
{ // 初始化成功
_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方法後纔可重寫構造方法。