例子:先自定义类
@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"]方法,最终完成初始化。 具体调用关系见下图所示,其中蓝色部分表示默认初始化方法。