IOS笔记-封装构造方法

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

在OC中,咱们一般要重写init方法以便在初始化的时候就给成员变量赋上一些值,因此咱们在建立对象的时候最好不要用new方法,由于这样咱们就不能重写构造方法了。那么怎么重写init方法呢?重写init方法的步骤:函数

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

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

三、返回初始化的对象。.net

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

 

[objc]  view plain copy
 
  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。code

 

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

那么咱们可不能够不在类中给成员变量赋初值,而是在其余地方赋值呢?blog

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

 

[objc]  view plain copy
 
  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

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

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

二、返回值通常是id类型。

三、方法名通常以initWith开头。

 

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

 

[objc]  view plain copy
 
  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方法,咱们就要调用父类的构造方法。也就是说,父类的属性交给父类来处理,子类的给子类来处理。

 

 

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

一、若是须要在初始化的时候就给成员变量赋值,咱们就要重写init方法,也就是构造方法。

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

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

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

相关文章
相关标签/搜索