六、oc中构造方法的学习

来源:互联网 发布:华为网络基础知识 编辑:程序博客网 时间:2024/05/02 01:32

      ------- <a href="http://www.itheima.com" target="blank">Windows Phone 7手机开发</a>、<a href="http://www.itheima.com" target="blank">.Ios培训</a>、期待与您交流! -------


      oc中的构造方法是用来初始化对象的方法,它是一个对象方法,例如:-init方法,它xcode中默认有的方法。调用-init方法的时候会遵循一个顺序,即是先初始化父类的成员变量(但是是先调用该类的-init方法)然后再一级一级的初始化子类的对象方法。为了能够使默认情况下某个成员变量的值不为0,为我们所需要的某个值,则常常需要重写构造方法。

      重写构造方法需要注意的是,先调用父类的构造方法self = [super init],这是固定写法,初学者们,需要牢记,然后再进行子类的内部成员的初始化。同时,还必须注意,是否初始化父类对象成功,必须在初始化父类对象成功后再进行子类的内部成员的初始化。

    例如:


#import "Bird.h"@implementation Person- (id)init{  self = [super init];     if(self != nil) // 如果对象初始化成功,才有必要进行接下来的初始化   {     _age = 10; // 初始化成功,再进行所需要的初始化赋值   }   // 或者可以写成下面这样的形式    if (self = [super init]) // 将右边赋值给左边,左边如果不等于空,则执行if语句    {        _age = 10;    }        return self;}@end
     

      上面代码,若调用一个Person类的对象,并且在不给_age赋新值的情况下,打印对象的_age的成员变量,则变量的值为10,这就说明初始化成功。

     还需要注意的时,在有继承关系的时候,子类在重写构造方法时,要注意父类中成员变量的类型,是私有、公有、还是保护类型。

     除了-init这类系统自带的方法,某些情况下,还需要程序员们自己编写一些常用的用户自定义的初始化方法,我们把这种方法叫做自定义构造方法。自定义构造方法需要注意的有,首先,它一定是对象方法,以 - 开头,其次返回值一般是id类型,方法名一般以initWith开头。

    例如:

   Person类的声明:

- (id)initWithName:(NSString *)name;- (id)initWithAge:(int)age;- (id)initWithAge:(int)age andName:(NSString *)name;
   Person类的实现:

- (id)init{   if (self = [super init])   {     _name = @"谭伟华_2015";      }    return self;}- (id)initWithName:(NSString *)name{    if (self = [super init])    {              _name = name;    }    return self;}- (id)initWithAge:(int)age{    if (self = [super init])    {            _age = age;    }    return self;}- (id)initWithAge:(int)age andName:(NSString *)name{   if (self = [super init])   {          _age = age;       _name = name;      }    return self;}
    Student类继承Person类,Person类中拥有_age与*_name的成员变量,Student类中拥有_no的成员变量

- (id)initWithNo:(int)no{    if (self = [super init])    {            _no = no;    }        return self;}
 
- (id)initWithName:(NSString *)name andAge:(int)age andNo:(int)no{   if (self = [super initWithAge:age andName:name])   {  //调用[super initWithAge:age andName:name]会回到Person类中去调用相应方法,初始化_age与_name        _no = no;   }        return self;}
   上面那样写的好处,可可以使父类的属性交给父类的方法去处理,子类方法处理子类的属性。

   main函数:

#import <Foundation/Foundation.h>#import "Person.h"#import "Student.h"int main(){        Student *s = [[Student alloc]initWithName:@"twh" andAge:24 andNo:1991];    NSLog(@"_name = %@ _age = %d _no = %d",s.name,s.age,s.no);    return 0;}
    程序执行的结果为:

  

     综上所述,-init构造方法,可以使我们改变某个或者某些成员变量的初始值。自定义构造方法,可以更加灵活并且更加直观可读的实现-init方法的功能。


     

    

0 0
原创粉丝点击