------- <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方法的功能。