1. 程式人生 > >構造方法(init方法)和init方法的重寫

構造方法(init方法)和init方法的重寫

/*

 1> 建立一個物件,那麼就呼叫這個類的new方法.

 2> new方法是一個類方法,new方法做的事情:

    1>在堆區開闢空間儲存物件,這個物件中會宣告它對應的類中定義的所有屬性(注意是屬性,沒有方法),還有一個isa指標,指向對應的在程式碼區中的類

    2>初始化這個物件內部屬性的值

        1,基本資料型別初始化為:0

        2,OC的指標初始化為:nil :(0X0)不指向任何地址

        3,如果是C指標初始化為:NULL (0X0)

    3>返回這個物件在堆區的地址

 3> new方法的底層

:

    new方法的底層是呼叫了alloc方法和init方法.

    alloc方法是一個類方法,這個方法做的事情是:建立物件.

    init方法是一個物件方法,這個方法做的事情是:初始化這個物件.(初始化就是為物件的屬性賦預設值.)

 4> 所以建立物件YYPerson *xiaoming = [YYPerson new];等價於YYPerson *xiaoming = [[YYPerson alloc]init];

因為new方法內部就是先呼叫類方法alloc,再呼叫物件方法init.

 5> init方法,我們叫做構造方法.

        init

方法做的事情是:初始化物件,為物件的屬性賦預設值(基本資料型別初始化為0/oc指標初始化為nil/c指標初始化為NULL).建立物件必須使用init方法初始化以後才可以使用,否則就有可能會產生各種各樣的問題.

 6> 重寫init方法.

如果我們希望物件創建出來以後,物件的屬性的值不是預設值0/nil/NULL,而是我們期望的值,那麼我們就可以重寫init方法.

        1, 先呼叫父類的init方法.

        2, init方法有返回值,返回值是當前物件,呼叫init方法有可能會執行失敗,執行失敗返回值就是nil.呼叫父類的init方法,將這個方法的返回值賦值給self.

        3, 判斷父類的init方法是否執行成功,如果成功,再去按照自己期望的方式初始化自己的屬性.

        4, 返回當前物件,self.

 7> 需要重寫init方法的情況.

        1, 當物件創建出來的時候,希望物件的屬性的值是我們指定的值,而不是0/nil/NULL.

        2, 如果有一段程式碼,希望在物件建立的同時執行,那麼我們就可以將這段程式碼寫在init方法中.

 8> 重寫init方法的規範.

必須先呼叫父類的init方法,並複製給self,並判斷是否成功執行.

    - (instancetype)init

    {

        if(self = [super init])//說明父類的init方法執行成功

            {

                初始化子類自己的屬性;

            }

            return self;

    }

 */

#import <Foundation/Foundation.h>

//人類的宣告

@interface YYPerson : NSObject

@propertyNSString *name;

@propertyint age;

- (void)sayHi;

@end

//人類的實現

@implementation YYPerson

- (void)sayHi

{

NSLog(@"大家好,我叫%@,今年%d歲了!", _name, _age);

}

- (instancetype)init//重寫init方法

{

    if(self = [super init])

    {

        self.name = @"小明";

        self.age = 18;

    }

return self;

}

@end

int main(int argc, const char * argv[]) {

//建立物件

YYPerson *xiaoming = [[YYPersonalloc]init];//此處呼叫了重寫之後的init方法,為物件的屬性賦值了期望的值.

//呼叫方法

    [xiaoming  sayHi];

    return 0;

}