美文网首页
07-08、构造方法基本概念:重写init方法

07-08、构造方法基本概念:重写init方法

作者: 山中石头 | 来源:发表于2017-09-21 10:47 被阅读0次

    在OC中init开头的方法, 我们称之为构造方法
    构造方法的用途: 用于初始化一个对象, 让某个对象一创建出来就拥有某些属性和值

    重写init方法, 在init方法中初始化成员变量
    注意: 重写init方法必须按照苹果规定的格式重写, 如果不按照规定会引发一些未知的错误
    1.必须先初始化父类, 再初始化子类
    2.必须判断父类是否初始化成功, 只有父类初始化成功才能继续初始化子类
    3.返回当前对象的地址

    #import "Person.h"
    
    @implementation Person
    
    /*
    第一种写法:
    - (instancetype)init
    {
    // 1.初始化父类
    // 只要父类初始化成功 , 就会返回对应的地址, 如果初始化失败, 就会返回nil
    // nil == 0 == 假 == 没有初始化成功
    self = [super init];
    // 2.判断父类是否初始化成功
    if (self != nil) {
        // 3.初始化子类
        // 设置属性的值
        _age = 6;
        
    }
    // 4.返回地址
    return self;
    }
     */
    
    /*
    第二种写法:
    - (instancetype)init
    {
    self = [super init]; // self == nil == 0
    if (self) {
        // 初始化子类
        _age = 6;
    }
    return self;
    }
     */
    //第三种写法:常用的写法
    - (instancetype)init
    {
    //    self = [super init];
    // 注意: 不要把 = 号写为 ==
    // 一定要将[super init]的返回值赋值给self
    if (self = [super init]) {
        // 初始化子类
        _age = 6;
    }
    return self;
    }
    
    @end
    

    例子:

    Person.m
    #import "Person.h"
    
    @implementation Person
    
    - (instancetype)init
    {
    if (self  = [super init]) {
        _age = 10;
    }
    return self;
    }
    
    - (NSString *)description
    {
    return [NSString stringWithFormat:@"age = %i", _age];
    }
    @end
    
    Studnet.m
    #import "Studnet.h"
    
    @implementation Studnet
    
    - (instancetype)init
    {
    if (self = [super init]) {
        
        //注意:这里不能直接访问父类的_age属性,因为被@property生成的成员变量是私有变量(和private不同的)只能在自己的那个类中可见和访问,才其他类中不可见,更不能直接访问了。所以这里想给_age赋值可以用self调用_age的setter方法。
        
    //        [self setAge:10];不过这里不用调用setter方法因为super就是父类,父类中已经初始化_age了
        
        _no = 1;
    }
    return self;
    }
    
    - (NSString *)description
    {
    return [NSString stringWithFormat:@"age = %i , no = %i", [self age], _no];
    }
    @end

    相关文章

      网友评论

          本文标题:07-08、构造方法基本概念:重写init方法

          本文链接:https://www.haomeiwen.com/subject/makzsxtx.html