对象的初始化方法

例子:先自定义类

@interface appliance : NSObject{  

     NSString * productName;  

    int voltage;  

}  

@property(copy) NSString * productName;  

@property int voltage;  

如果这个时候要初始化,直接appliance *a = [[appliance alloc] init]就ok。

但是,此时执行的都是NSobject定义的init方法,实例变量全部会初始化为0。如果需要初始化为非零,要在appliance.m里面实现新的init方法,覆盖父类的方法。

-(id)init{  

    self = [super init];               //1.继承自父类对象的初始化  

    if (self) {                               //2.子类本身对象的初始化  

        [self setVoltage:220];      //调用存取方法赋值,也可以直接赋值 voltage = 220;  

    }  

    return self;  

}  

如果希望productName的值也非空,因为init是没有实际参数的,所以要创建一个新的初始化方法。

-(id)initWithProductName:(NSString *)pn{  

    self = [super init];  

    if (self) {  

      [self setVoltage:220];  

        [self setProductName:pn];  

    }  

    return self;  

}  

这样初始化的时候用这个函数就可以

appliance *a = [[appliance alloc] initWithProductName:@"Fan"];  

当然,这会遇到一个问题,与我们的习惯不符合,因为我们一般采用init方法来初始化。所以我们还是重新init方法好了。  

-(id) init{  

  return [self initWithProductName:@"unknown"];  

}

此时,就可以直接的初始化  appliance *a = [[appliance alloc] init];

如果你继续去添加子类,例如在加一个OwnerAppliance的继承类,并且新加一个对象ownerName,如果你想给他一个默认的值,是同样的道理,先写一个默认的初始化函数

- (id)initWithProductName:(NSString *)pn OwnerName:(NSString *)n{
    self = [super initWithProductName:pn];
    [self setOwnerName:n];
    return self;
}

  初始化的时候就可以直接写

OwnedAppliance *a2 = [[OwnedAppliancealloc]initWithProductName:@"fan"OwnerName:@"liu"];

当然,和以前一样,如果你希望和以前一样,想用父类的初始化函数,就必须要重写。

- (id)initWithProductName:(NSString *)pn{
    return [self initWithProductName:pn OwnerName:@"liu"];
}

写完以后,初始化就可以 直接写

OwnedAppliance *a2 = [[OwnedAppliance alloc]init];

请注意,这个地方你并没有重写init方法,那么为什么可以直接写呢?

因为你没有重写init方法,所以会调用Appliance的init方法,然后会调用

initWithProductName方法,但是这个地方请注意,此时的self对象是OwnedAppliance实例,因此调用的是它的initWithProductName方法,此方法又调用[self initWithProductName:pn OwnerName:@"liu"]方法,最终完成初始化。 具体调用关系见下图所示,其中蓝色部分表示默认初始化方法。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值