[Object-C]OC实例变量初始化方法

来源:互联网 发布:共享网络下的防监听 编辑:程序博客网 时间:2024/05/19 00:53
OC实例变量初始化方法
1 使用实例setter方法 默认初始化方法 + setName:xxx setAge:xxx
2 使用实例功能类方法,默认初始化方法 + setName:xxx age:xxx
3 使用实例初始化方法 initWith开头的方法
4 使用构造器 类名+With…
以Person  Student两个类为例
1 使用实例 setter方法
这是最麻烦的方法
[html] view plaincopy
  1. @interface Person : NSObject  
  2. {  
  3.     NSString *_name;  
  4.     NSString *_sex;  
  5.     int _age;  
  6. }  
  7.   
  8.   
  9. //setter方法  
  10. -(void)setName:(NSString *)name;  
  11. -(void)setSex:(NSString *)sex;  
  12. -(void)setAge:(int)age;  
  13. @end  
  14.   
  15.   
  16. @implementation Person  
  17. //setter方法  
  18. -(void)setName:(NSString *)name  
  19. {  
  20.     _name = name;  
  21. }  
  22. -(void)setSex:(NSString *)sex  
  23. {  
  24.     _sex = sex;  
  25. }  
  26. -(void)setAge:(int)age  
  27. {  
  28.     _age = age;  
  29. }  
  30.   
  31.   
  32. @end  
  33.   
  34.   
  35. @interface Student : Person  
  36. {  
  37.     NSString *_studentID;  
  38.     float _score;  
  39. }  
  40. //setter  
  41. -(void)setStudentID:(NSString *)studentID;  
  42. -(void)setScore:(float)score;  
  43.   
  44.   
  45. @end  
  46.   
  47.   
  48. @implementation Student : Person  
  49.   
  50.   
  51. //setter  
  52. -(void)setStudentID:(NSString *)studentID  
  53. {  
  54.     _studentID = studentID;  
  55. }  
  56. -(void)setScore:(float)score  
  57. {  
  58.     _score = score;  
  59. }  
  60. @end  
  61.   
  62.   
  63. int main()  
  64. {  
  65.     Student *stu = [[Student alloc]init];//开辟空间调用初始化方法  
  66.     //使用setter方法为实例变量赋值。  
  67.     [stu setName:@"xiaoA"];  
  68.     [stu setSex:@"Man"];  
  69.     [stu setAge:15];  
  70.     [stu setStudentID:@"2008-07"];  
  71.     [stu setScore:96];  
  72.   
  73.   
  74.     return 0;  
  75. }  



2 使用实例功能类方法赋值
简单于setter方法
[html] view plaincopy
  1. @interface Person : NSObject  
  2. {  
  3.     NSString *_name;  
  4.     NSString *_sex;  
  5.     int _age;  
  6. }  
  7.   
  8.   
  9. -(void)setName:(NSString *)name sex:(NSString *)sex age:(int)age;  
  10.   
  11.   
  12. @end  
  13.   
  14.   
  15. @implementation Person  
  16.   
  17.   
  18. -(void)setName:(NSString *)name sex:(NSString *)sex age:(int)age  
  19. {  
  20.     _name = name;  
  21.     _sex = sex;  
  22.     _age = age;  
  23. }  
  24.   
  25.   
  26. @end  
  27.   
  28.   
  29. @interface Student : Person  
  30. {  
  31.     NSString *_studentID;  
  32.     float _score;  
  33. }  
  34.   
  35.   
  36. -(void)setStudentID:(NSString *)studentID score:(float)score;  
  37. @end  
  38.   
  39.   
  40. @implementation Student : Person  
  41.   
  42.   
  43. -(void)setStudentID:(NSString *)studentID score:(float)score  
  44. {  
  45.     _studentID = studentID;  
  46.     _score = score;  
  47. }  
  48. @end  
  49.   
  50.   
  51. int main()  
  52. {  
  53.     Student *stu = [[Student alloc]init];//开辟空间调用初始化方法  
  54.     //使用setter方法为实例变量赋值。  
  55.     [stu setName:@"xiaoA" sex:@"Man" age:15];  
  56.     [stu setStudentID:@"2008-02" score:97];  
  57.       
  58.     return 0;  
  59. }  




3 使用实例初始化方法 initWith开头的方法
这是一种比较常用的方法
[html] view plaincopy
  1. @interface Person : NSObject  
  2. {  
  3.     NSString *_name;  
  4.     NSString *_sex;  
  5.     int _age;  
  6. }  
  7.   
  8.   
  9. -(void)initWithName:(NSString *)name sex:(NSString *)sex age:(int)age;  
  10.   
  11.   
  12. @end  
  13.   
  14.   
  15. @implementation Person  
  16.   
  17.   
  18. -(void)initWithName:(NSString *)name sex:(NSString *)sex age:(int)age  
  19. {  
  20.     self = [super init];  
  21.     if(self)  
  22.     {  
  23.     _name = name;  
  24.     _sex = sex;  
  25.     _age = age;  
  26.     }  
  27.     return self;  
  28. }  
  29.   
  30.   
  31. @end  
  32.   
  33.   
  34. @interface Student : Person  
  35. {  
  36.     NSString *_studentID;  
  37.     float _score;  
  38. }  
  39.   
  40.   
  41. -(void)initWithName:(NSString *)name sex:(NSString *)sex age:(int)age studentID:(NSString *)studentID score:(float)score;  
  42. @end  
  43.   
  44.   
  45. @implementation Student : Person  
  46.   
  47.   
  48. -(void)initWithName:(NSString *)name sex:(NSString *)sex age:(int)age studentID:(NSString *)studentID score:(float)score  
  49. {  
  50.     self = [super initWithName:name sex:sex age:age];  
  51.     if(self)  
  52.     {  
  53.         _studentID = studentID;  
  54.         _score = score;  
  55.     }  
  56.     return self;  
  57. }  
  58.   
  59.   
  60. @end  
  61.   
  62.   
  63. int main()  
  64. {  
  65.     Student *stu = [[Student alloc]initWithName:@"xiaoA" sex:@"Man" age:15 studentID:@"2008-2" score:97];//开辟空间调用初始化方法  
  66.       
  67.     return 0;  
  68. }  




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