Objective-C初始化方法
1、初始化方法:
#import <Foundation/Foundation.h>
@interface Person : NSObject{
NSString *_name;
NSInteger _age;
}
//自定义初始化方法,必须以init开头
- (id)initWithName:(NSString *)name withAge:(NSInteger)age;
//打印信息
- (void)showInfo;
@end
这里我们定义了一个初始化方法,对名称和年龄进行初始化赋值操作
方法实现:
#import "Person.h"
@implementation Person
- (id)initWithName:(NSString *)name withAge:(NSInteger)age{
//固定写法,可以背下来哦~~
//调用父类的初始化方法
self = [super init];
if(self != nil){
_name = name;
_age = age;
}
return self;
}
@end
注:OC中自定义初始化方法的名称必须是以init开头
OC实例变量初始化方法
1 使用实例setter方法 默认初始化方法 + setName:xxx setAge:xxx
2 使用实例功能类方法,默认初始化方法 + setName:xxx age:xxx
3 使用实例初始化方法 initWith开头的方法
4 使用构造器 类名+With…
以Person Student两个类为例
1 使用实例 setter方法
这是最麻烦的方法
@interface Person : NSObject
{
NSString *_name;
NSString *_sex;
int _age;
}
//setter方法
-(void)setName:(NSString *)name;
-(void)setSex:(NSString *)sex;
-(void)setAge:(int)age;
@end
@implementation Person
//setter方法
-(void)setName:(NSString *)name
{
_name = name;
}
-(void)setSex:(NSString *)sex
{
_sex = sex;
}
-(void)setAge:(int)age
{
_age = age;
}
@end
@interface Student : Person
{
NSString *_studentID;
float _score;
}
//setter
-(void)setStudentID:(NSString *)studentID;
-(void)setScore:(float)score;
@end
@implementation Student : Person
//setter
-(void)setStudentID:(NSString *)studentID
{
_studentID = studentID;
}
-(void)setScore:(float)score
{
_score = score;
}
@end
int main()
{
Student *stu = [[Student alloc]init];//开辟空间调用初始化方法
//使用setter方法为实例变量赋值。
[stu setName:@"xiaoA"];
[stu setSex:@"Man"];
[stu setAge:15];
[stu setStudentID:@"2008-07"];
[stu setScore:96];
return 0;
}
2 使用实例功能类方法赋值
简单于setter方法
@interface Person : NSObject
{
NSString *_name;
NSString *_sex;
int _age;
}
-(void)setName:(NSString *)name sex:(NSString *)sex age:(int)age;
@end
@implementation Person
-(void)setName:(NSString *)name sex:(NSString *)sex age:(int)age
{
_name = name;
_sex = sex;
_age = age;
}
@end
@interface Student : Person
{
NSString *_studentID;
float _score;
}
-(void)setStudentID:(NSString *)studentID score:(float)score;
@end
@implementation Student : Person
-(void)setStudentID:(NSString *)studentID score:(float)score
{
_studentID = studentID;
_score = score;
}
@end
int main()
{
Student *stu = [[Student alloc]init];//开辟空间调用初始化方法
//使用setter方法为实例变量赋值。
[stu setName:@"xiaoA" sex:@"Man" age:15];
[stu setStudentID:@"2008-02" score:97];
return 0;
}
3 使用实例初始化方法 initWith开头的方法
这是一种比较常用的方法
@interface Person : NSObject
{
NSString *_name;
NSString *_sex;
int _age;
}
-(void)initWithName:(NSString *)name sex:(NSString *)sex age:(int)age;
@end
@implementation Person
-(void)initWithName:(NSString *)name sex:(NSString *)sex age:(int)age
{
self = [super init];
if(self)
{
_name = name;
_sex = sex;
_age = age;
}
return self;
}
@end
@interface Student : Person
{
NSString *_studentID;
float _score;
}
-(void)initWithName:(NSString *)name sex:(NSString *)sex age:(int)age studentID:(NSString *)studentID score:(float)score;
@end
@implementation Student : Person
-(void)initWithName:(NSString *)name sex:(NSString *)sex age:(int)age studentID:(NSString *)studentID score:(float)score
{
self = [super initWithName:name sex:sex age:age];
if(self)
{
_studentID = studentID;
_score = score;
}
return self;
}
@end
int main()
{
Student *stu = [[Student alloc]initWithName:@"xiaoA" sex:@"Man" age:15 studentID:@"2008-2" score:97];//开辟空间调用初始化方法
return 0;
}
这种赋值方法有几点需要注意:
1) 自写初始化函数需要 以 initWith开头 必须形如 initWith…注意大小写
2 )一个类里可以有多个初始化方法,但是只能有一个“指定初始化”方法,指定初始化方法是在调用任意一个初始化方法的时候都会默认被调用的初始化方法,也就是说 指定初始化方法是在其它初始化方法里面被调用的,每一个初始化方法内部必须调用指定初始化方法,这不是规则,而是通用的原则。
如 上例做如下修改:
添加一个初始化方法:
h文件声明:
-(void)initWithStudentID:(NSString *)studentID score:(float)score;
m文件实现:
-(void)initWithStudentID:(NSString *)studentID score:(float)score
{
self = [self initWithName:NIL sex:NIL age:NIL studentID:studentID score: score
}
3 )注意继承的初始化的写法
4) self类似与其它语言的this指针,指向当前的对象,如果在方法里面类调用 就指代当前类,对象调用就指代当前对象
4 便利构造器方法
便利构造器书写规则
类方法 开头以类名开头类名首字母小写 后续驼峰法,属于类方法 用+号
如上例定义便利构造器
+(void)studentWithName:(NSString *)name sex:(NSString *)sex age:(int)age studentID:(NSString *)studentID score:(float)score
{
Student *stu = [[self alloc]studentWithName:name sex:sex age:age studentID:studentID score:score];
}
此时,创建对象的方法就变成了
int main
{
Student *stu = [Student studentWithName:@"xiaoA" sex:@"Man" age:16 studentID:@"2008-02" score:97]
return 0;
}
这种方法创建对象就很便捷了,因为无需每次手动申请空间,调用alloc函数。
一个初始化函数里面只能有一个super init类的方法,这样能保证多个入口一个出口,避免混乱。