zoukankan      html  css  js  c++  java
  • 构造方法概念,自定义构造(init)方法的用途, 类工厂方法(就是直接用类名 类调用)

    一、 构造方法

    构造方法:在OC中init开头的方法, 我们称之为构造方法

    构造方法的用途: 用于初始化一个对象, 让某个对象一创建出来就拥有某些属性和值

    // 比如我们定义一个Person的类,然后在类里面定义一个age的变量。如果不使用构造方法,有需求创建5个人,每个人年龄初始化为6,这么我们就需要下面的6句代码。
    
    Person *p = [[Person alloc] init];
    //    p.age = 6;
        NSLog(@"%i", p.age);
        
        Person *p2 = [[Person alloc] init];
    //    p2.age = 6;
        NSLog(@"%i", p2.age);
        
        Person *p3 = [[Person alloc] init];
    //    p3.age = 6;
        NSLog(@"%i", p3.age);
    
    
    // 如果使用构造方法的话,我们再init方法中将_age 初始化,这样就不用再赋值了,这是最简单的应用。
    - (instancetype)init
    {
        self = [super init]; // self == nil == 0
        if (self) {
            // 初始化子类
            _age = 6;
        }
        return self;
    }

     需要注意的是重写init方法有固定的格式,如果不按照苹果这个格式来,编译无法通过,记住就行了。

    重写init方法, 在init方法中初始化成员变量

    注意: 重写init方法必须按照苹果规定的格式重写, 如果不按照规定会引发一些未知的错误

    1.必须先初始化父类, 再初始化子类

    2.必须判断父类是否初始化成功, 只有父类初始化成功才能继续初始化子类

    3.返回当前对象的地址

    - (instancetype)init
    {
        // 1.初始化父类
        // 只要父类初始化成功 , 就会返回对应的地址, 如果初始化失败, 就会返回nil
        // nil == 0 == 假 == 没有初始化成功
        self = [super init];
        // 2.判断父类是否初始化成功
        if (self != nil) {
            // 3.初始化子类
            // 设置属性的值
            _age = 6;
            
        }
        // 4.返回地址
        return self;
    }

     如果该构造方法需要我们自己自定义,比如,不想一创建出来的年龄是6,而是工程师自己传入的值就需要自定义了,格式也必须是固定的

    // 必须以init开头,With必须大写。
    - (instancetype)initWithAge:(int)age
    {
        if (self = [super init]) {
            _age = age;
        }
        return self;
    }

     如果涉及到继承,比如,Student 继承自 Person,

    // Person类中有方法:- (instancetype)initWithAge:(int)age;
    // Student中有方法:- (instancetype)initWithAge:(int)age andName:(NSString *)name andNo:(int)no;   继承自父类,但是自己多了name和no(number)属性
    
    // student 继承自 person,我们需要设置以下内容
    
    
    Student *stu = [[Student alloc] initWithAge:30 andName:@"lnj" andNo:888];
    
    // 那么我们在父类和子类中应该分别写上一下代码,自己的事情自己做,子类别干涉父类的方法
    
    // person 父类方法
    - (instancetype)initWithAge:(int)age
    // 注意: 自定义构造方法中的init后面的With的W一定要大写
    //- (instancetype)initwithAge:(int)age
    {
        if (self = [super init]) {
            _age = age;
        }
        return self;
    }
    
    // student 子类方法
    - (instancetype)initWithAge:(int)age andName:(NSString *)name andNo:(int)no
    {
        /*  别这样写,设置父类的代码就让父类来做,自己就设置自己的参数就行了
        if (self = [super init]) {
    //        _age = age;
            // 狗拿耗子, 多管闲事
            // 自己的事情自己做
            [self setAge:age];
            [self setName:name];
        }
         */
        if (self = [super initWithAge:age andName:name]) {
            _no = no;
        }
        return self;
    }

     二、类工厂方法

    // 如果仔细观察,iOS构造方法,一般都会对应一个类工厂方法,方便程序员交流,减少代码量
    
    + (instancetype)person
    {
    //    return [[Person alloc] init];
        // 注意: 以后但凡自定义类工厂方法, 在类工厂方法中创建对象一定不要使用类名来创建
        // 一定要使用self来创建,这样,如果是person的子类来调用该方法,self就代表子类,不然就是person,不符合我们本意
        // self在类方法中就代表类对象, 到底代表哪一个类对象呢?
        // 谁调用当前方法, self就代表谁
        return [[self alloc] init];
    }
    
    + (instancetype)personWithAge:(int)age
    {
    //    Person *p = [[Person alloc] init];
        Person *p = [[self alloc] init];
        p.age = age;
        return p;
    }
  • 相关阅读:
    MaltReport2:通用文档生成引擎
    PostgreSQL 10 如何使用 PgAdmin3
    Stackoverflow 珠玑:C#封装重试指定次数的功能
    C# 6 元组应用 Part 2:C# 也玩模式匹配
    C# 6 元组应用 Part 1:方便的字典工厂方法
    Stackoverflow 珠玑:用于分组的 LINQ 扩展方法
    Linux 下的 PostgreSQL 数据库+文件通用自动备份脚本
    让 Odoo POS 支持廉价小票打印机
    NopCommerce 根据手机浏览器和桌面浏览器切换 Theme
    为什么 C# 比 C++ 编译快那么多
  • 原文地址:https://www.cnblogs.com/XXxiaotaiyang/p/5025404.html
Copyright © 2011-2022 走看看