Objective-c - 构造方法(init方法)和init方法的重写

来源:互联网 发布:终端如何退出python 编辑:程序博客网 时间:2024/05/21 00:14

/*

 

 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


@property NSString *name;

@property int age;



- (void)sayHi;


@end


//人类的实现

@implementation YYPerson


- (void)sayHi

{

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

}


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

{

    if(self = [superinit])

    {

        self.name =@"小明";

        self.age =18;

    }

    return self;

}


@end



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

    

    //创建对象

    YYPerson *xiaoming = [[YYPersonalloc]init];//此处调用了重写之后的init方法,为对象的属性赋值了期望的值.

    

    //调用方法

    [xiaoming  sayHi];

    

    return 0;

}

0 0