oc实例变量初始化方法

时间:2023-03-09 18:50:11
oc实例变量初始化方法

1 使用实例setter方法 默认初始化方法 + setName:xxx setAge:xxx

2 使用实例功能类方法,默认初始化方法 + setName:xxx age:xxx
3 使用实例初始化方法 initWith开头的方法
4 使用构造器 类名+With…
以Person  Student两个类为例
1 使用实例 setter方法
这是最麻烦的方法
  1. @interface Person : NSObject
  2. {
  3. NSString *_name;
  4. NSString *_sex;
  5. int _age;
  6. }
  7. //setter方法
  8. -(void)setName:(NSString *)name;
  9. -(void)setSex:(NSString *)sex;
  10. -(void)setAge:(int)age;
  11. @end
  12. @implementation Person
  13. //setter方法
  14. -(void)setName:(NSString *)name
  15. {
  16. _name = name;
  17. }
  18. -(void)setSex:(NSString *)sex
  19. {
  20. _sex = sex;
  21. }
  22. -(void)setAge:(int)age
  23. {
  24. _age = age;
  25. }
  26. @end
  27. @interface Student : Person
  28. {
  29. NSString *_studentID;
  30. float _score;
  31. }
  32. //setter
  33. -(void)setStudentID:(NSString *)studentID;
  34. -(void)setScore:(float)score;
  35. @end
  36. @implementation Student : Person
  37. //setter
  38. -(void)setStudentID:(NSString *)studentID
  39. {
  40. _studentID = studentID;
  41. }
  42. -(void)setScore:(float)score
  43. {
  44. _score = score;
  45. }
  46. @end
  47. int main()
  48. {
  49. Student *stu = [[Student alloc]init];//开辟空间调用初始化方法
  50. //使用setter方法为实例变量赋值。
  51. [stu setName:@"xiaoA"];
  52. [stu setSex:@"Man"];
  53. [stu setAge:15];
  54. [stu setStudentID:@"2008-07"];
  55. [stu setScore:96];
  56. return 0;
  57. }

2 使用实例功能类方法赋值
简单于setter方法

  1. @interface Person : NSObject
  2. {
  3. NSString *_name;
  4. NSString *_sex;
  5. int _age;
  6. }
  7. -(void)setName:(NSString *)name sex:(NSString *)sex age:(int)age;
  8. @end
  9. @implementation Person
  10. -(void)setName:(NSString *)name sex:(NSString *)sex age:(int)age
  11. {
  12. _name = name;
  13. _sex = sex;
  14. _age = age;
  15. }
  16. @end
  17. @interface Student : Person
  18. {
  19. NSString *_studentID;
  20. float _score;
  21. }
  22. -(void)setStudentID:(NSString *)studentID score:(float)score;
  23. @end
  24. @implementation Student : Person
  25. -(void)setStudentID:(NSString *)studentID score:(float)score
  26. {
  27. _studentID = studentID;
  28. _score = score;
  29. }
  30. @end
  31. int main()
  32. {
  33. Student *stu = [[Student alloc]init];//开辟空间调用初始化方法
  34. //使用setter方法为实例变量赋值。
  35. [stu setName:@"xiaoA" sex:@"Man" age:15];
  36. [stu setStudentID:@"2008-02" score:97];
  37. return 0;
  38. }

3 使用实例初始化方法 initWith开头的方法
这是一种比较常用的方法

  1. @interface Person : NSObject
  2. {
  3. NSString *_name;
  4. NSString *_sex;
  5. int _age;
  6. }
  7. -(void)initWithName:(NSString *)name sex:(NSString *)sex age:(int)age;
  8. @end
  9. @implementation Person
  10. -(void)initWithName:(NSString *)name sex:(NSString *)sex age:(int)age
  11. {
  12. self = [super init];
  13. if(self)
  14. {
  15. _name = name;
  16. _sex = sex;
  17. _age = age;
  18. }
  19. return self;
  20. }
  21. @end
  22. @interface Student : Person
  23. {
  24. NSString *_studentID;
  25. float _score;
  26. }
  27. -(void)initWithName:(NSString *)name sex:(NSString *)sex age:(int)age studentID:(NSString *)studentID score:(float)score;
  28. @end
  29. @implementation Student : Person
  30. -(void)initWithName:(NSString *)name sex:(NSString *)sex age:(int)age studentID:(NSString *)studentID score:(float)score
  31. {
  32. self = [super initWithName:name sex:sex age:age];
  33. if(self)
  34. {
  35. _studentID = studentID;
  36. _score = score;
  37. }
  38. return self;
  39. }
  40. @end
  41. int main()
  42. {
  43. Student *stu = [[Student alloc]initWithName:@"xiaoA" sex:@"Man" age:15 studentID:@"2008-2" score:97];//开辟空间调用初始化方法
  44. return 0;
  45. }

这种赋值方法有几点需要注意:
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类的方法,这样能保证多个入口一个出口,避免混乱。