黑馬程序員----Objective-C學習筆記之構造方法

------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


發佈了65 篇原創文章 · 獲贊 2 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章