OC实例变量初始化方法

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类的方法,这样能保证多个入口一个出口,避免混乱。

 

转载于:https://www.cnblogs.com/SummerSunshine/p/4188205.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值