zoukankan      html  css  js  c++  java
  • IOS笔记-封装构造方法

    前面我们用OC的类创建对象的时候我们用的是new方法。其实new方法是一个组合的方法,它是由两个方法组合在一块的,分别是alloc方法和init方法。其中alloc方法是类方法,它是用来给对象分配一个存储空间的,init方法是对象方法,它是用来对对象进行初始化的,init方法也叫做构造方法。

    在OC中,我们通常要重写init方法以便在初始化的时候就给成员变量赋上一些值,所以我们在创建对象的时候最好不要用new方法,因为这样我们就不能重写构造方法了。那么怎么重写init方法呢?重写init方法的步骤:

    1、调用父类的init方法。这是为了先初始化父类中声明的成员变量和其他属性。

    2、判断对象是否初始化成功,成功的话再对子类的成员变量进行初始化。

    3、返回初始化的对象。

    下面我们创建一个Person类,类中定义了一个int类型的成员变量_age,下面我们创建一个Person类的对象并对其初始化,使_age的值为20。

    [objc] view plaincopy
     
    1. #import <Foundation/Foundation.h>  
    2.   
    3. // Person类的声明  
    4. @interface Person : NSObject  
    5. @property int age;  
    6. @end  
    7.   
    8. // Person类的实现  
    9. @implementation Person  
    10. // 重写init方法  
    11. - (id)init  
    12. {  
    13.     // 判断父类的初始化是否完成,完成的话对_age进行初始化  
    14.     if (self = [super init]) {  
    15.         _age = 20;  
    16.     }  
    17.       
    18.     // 返回初始化完成后的对象  
    19.     return self;  
    20. }  
    21. @end  
    22.   
    23. int main()  
    24. {  
    25.     // 创建一个Person类的对象  
    26.     Person *p = [[Person alloc] init];  
    27.     // 输出_age的值  
    28.     NSLog(@"_age = %d", p.age);  
    29.       
    30.     return 0;  
    31. }  


    上面是对Person类的p对象进行初始化并使_age的值在初始化完成后就是20。

    重写init方法的注意点:先调用父类的init方法[super init],再对子类的成员变量初始化。

    那么我们可不可以不在类中给成员变量赋初值,而是在其他地方赋值呢?

    在其他地方赋初值的话就要重新定义init方法,下面我们学习在main函数中传入成员变量的初值。

    [objc] view plaincopy
     
    1. #import <Foundation/Foundation.h>  
    2.   
    3. @interface Person : NSObject  
    4. @property int age;  
    5.   
    6. // 重新设计构造方法需要先声明  
    7. - (id)initWithAge:(int)age;  
    8. @end  
    9.   
    10. @implementation Person  
    11. // 重新设计的构造方法并初始化_age  
    12. - (id)initWithAge:(int)age  
    13. {  
    14.     if (self = [super init]) {  
    15.         _age = age;  
    16.     }  
    17.     return self;  
    18. }  
    19. @end  
    20.   
    21. int main()  
    22. {  
    23.     // 创建一个Person类的对象,调用重新设计的构造方法并传入赋给_age的值  
    24.     Person *p = [[Person alloc] initWithAge:23];  
    25.     // 输出_age的值  
    26.     NSLog(@"_age = %d", p.age);  
    27.       
    28.     return 0;  
    29. }  


    上面代码输出结果是:

    _age = 23

    自定义构造方法的注意点是:

    1、以“-”号开头,也就是必须是对象方法。

    2、返回值一般是id类型。

    3、方法名一般以initWith开头。

    下面我们学习子类继承父类时怎么设计构造方法。

    [objc] view plaincopy
     
    1. #import <Foundation/Foundation.h>  
    2.   
    3. // Person类的声明和实现  
    4. @interface Person : NSObject  
    5. @property int age;  
    6. // 设计的构造方法的声明  
    7. - (id)initWithAge:(int)age;  
    8. @end  
    9. @implementation Person  
    10. // 设计的构造方法的实现  
    11. - (id)initWithAge:(int)age  
    12. {  
    13.     if (self = [super init]) {  
    14.         _age = age;  
    15.     }  
    16.     return self;  
    17. }  
    18. @end  
    19.   
    20. // Student类的声明和实现  
    21. @interface Student : Person  
    22. @property double score;  
    23. // 设计的构造函数的声明  
    24. - (id)initWithAge:(int)age andScore:(double)score;  
    25. @end  
    26. @implementation Student  
    27. // 设计的构造方法的实现  
    28. - (id)initWithAge:(int)age andScore:(double)score  
    29. {  
    30.     //调用了父类重新设计的构造方法  
    31.     if (self = [super initWithAge:age]) {  
    32.         _score = score;  
    33.     }  
    34.     return self;  
    35. }  
    36. @end  
    37.   
    38. int main()  
    39. {  
    40.     // 创建一个Student类的对象,调用重新设计的构造方法并传入_age和_score的值。  
    41.     Student *s = [[Student alloc] initWithAge:18 andScore:92];  
    42.     // 输出_age的值  
    43.     NSLog(@"_age = %d, _score = %.1f", s.age, s.score);  
    44.       
    45.     return 0;  
    46. }  


    上面的代码的重点是在子类的构造方法中调用了父类的构造方法。在设计构造方法中,如果子类需要对父类的成员变量进行初始化且父类中已经定义了对该成员变量初始化的init方法,我们就要调用父类的构造方法。也就是说,父类的属性交给父类来处理,子类的给子类来处理。

    以上就是构造方法的简单介绍。我们来总结几个重点:

    1、如果需要在初始化的时候就给成员变量赋值,我们就要重写init方法,也就是构造方法。

    2、重写构造方法的时候一定要调用父类的构造方法。

    3、设计构造方法的时候记得父类的属性交给父类处理。

    4、构造方法必须是对象方法。

  • 相关阅读:
    jdbc操作元数据
    jdbc完成增删改查
    jdbc原理
    JDBC快速入门
    DOM_调查问卷效果2
    DOM_radio
    DOM_mail效果
    css基础
    《POSIX多线程程序设计》读书笔记
    《(转载)Bullet物理引擎不完全指南(Bullet Physics Engine not complete Guide)》
  • 原文地址:https://www.cnblogs.com/houzhitong/p/4511714.html
Copyright © 2011-2022 走看看