------Java培訓、Android培訓、iOS培訓、.Net培訓--------
1、構造方法的調用
Dog *d = [Dog new];
new方法做三件事:
A、使用alloc方法來分配存儲空間(返回分配的對象)
B、使用init方法來給對象初始化
C、返回對象的首地址
可以把new方法拆開如下
A、調用類方法+alloc分配存儲空間,返回未經初始化的對象
Dog *d = [Dog alloc];
B、調用對象方法-init進行初始化,返回對象本身
Dog *d2 = [d ini];
C、以上兩個過程整合爲一句:
Dog *d = [[Dog alloc] init];等價於[Dog new]
【說明】
1)init方法就是構造方法,是用來初始化對象的方法,該方法是一個對象方法。默認所有成員變量都是0或null
2)一個剛剛分配的對象並不能立即使用,需要先初始化該對象,然後才能使用,否則,可能出現一些不可預測的行爲。
2、重寫構造方法
【要求】Person類對象創建完成以後,默認的年齡是10歲
當子類把父類的init覆蓋時,先執行子類的
【super】並不是真正的指針,[super message]的實質是由self來接受父類的message。
self = [super init]的作用:
是爲了防止父類的初始化方法release掉了self指向的空間,並重新alloc了一塊空間,這時,[super init]可能alloc失敗,就不會再執行if中的語句
例如:
#import <Foundation/Foundation.h>
#pragma mark Person類聲明部分
//【要求】人年齡創建後默認爲10
@interface Person: NSObject{
int _age;//年齡
NSString *_name;//姓名
}
-(void)showAge;
@end
#pragma mark Person類實現部分
@implementation Person
-(id)init{
//先判斷父類是否初始化成功,想讓父類完成創建任務
if (self = [super init]) {
self->_age = 10;//使創建後默認值爲10
}
return self;//self指代的是方法的調用對象
}
-(void)showAge{
NSLog(@"age = %d",_age);
}
@end
#pragma mark Student類聲明部分
//【要求】學生創建後學號默認爲1
@interface Student: Person{
int _sno;//學號
}
@end
#pragma mark Student類實現部分
@implementation Student
-(id)init{
if (self = [super init]) {
self->_sno = 11;
}
return self;
}
-(void)showAge{
NSLog(@"age = %d, sno = %d",_age,_sno);
}
@end
int main(int argc, const char * argv[])
{
@autoreleasepool {
//Person對象在創建後,年齡默認爲10,學生默認學號爲1
Person *p = [[Person alloc] init];
[p showAge];
//創建學生
Student *st = [[Student alloc] init];
[st showAge];
}
return 0;
}
打印結果:
2015-10-05 15:07:14.090 Demo01[2390:303] age = 10
2015-10-05 15:07:14.095 Demo01[2390:303] age = 10, sno= 11