黑马程序员-IOS笔记-封装构造方法

前面我们用OC的类创建对象的时候我们用的是new方法。其实new方法是一个组合的方法,它是由两个方法组合在一块的,分别是alloc方法和init方法。其中alloc方法是类方法,它是用来给对象分配一个存储空间的,init方法是对象方法,它是用来对对象进行初始化的,init方法也叫做构造方法。

在OC中,我们通常要重写init方法以便在初始化的时候就给成员变量赋上一些值,所以我们在创建对象的时候最好不要用new方法,因为这样我们就不能重写构造方法了。那么怎么重写init方法呢?重写init方法的步骤:

1、调用父类的init方法。这是为了先初始化父类中声明的成员变量和其他属性。

2、判断对象是否初始化成功,成功的话再对子类的成员变量进行初始化。

3、返回初始化的对象。

下面我们创建一个Person类,类中定义了一个int类型的成员变量_age,下面我们创建一个Person类的对象并对其初始化,使_age的值为20。

[objc] view plaincopy

  1. #import <Foundation/Foundation.h>
  2. // Person类的声明
  3. @interface Person : NSObject
  4. @property int age;
  5. @end
  6. // Person类的实现
  7. @implementation Person
  8. // 重写init方法
  9. - (id)init
  10. {
  11. // 判断父类的初始化是否完成,完成的话对_age进行初始化
  12. if (self = [super init]) {
  13. _age = 20;
  14. }
  15. // 返回初始化完成后的对象
  16. return self;
  17. }
  18. @end
  19. int main()
  20. {
  21. // 创建一个Person类的对象
  22. Person *p = [[Person alloc] init];
  23. // 输出_age的值
  24. NSLog(@"_age = %d", p.age);
  25. return 0;
  26. }

上面是对Person类的p对象进行初始化并使_age的值在初始化完成后就是20。

重写init方法的注意点:先调用父类的init方法[super init],再对子类的成员变量初始化。

那么我们可不可以不在类中给成员变量赋初值,而是在其他地方赋值呢?

在其他地方赋初值的话就要重新定义init方法,下面我们学习在main函数中传入成员变量的初值。

[objc] view plaincopy

  1. #import <Foundation/Foundation.h>
  2. @interface Person : NSObject
  3. @property int age;
  4. // 重新设计构造方法需要先声明
  5. - (id)initWithAge:(int)age;
  6. @end
  7. @implementation Person
  8. // 重新设计的构造方法并初始化_age
  9. - (id)initWithAge:(int)age
  10. {
  11. if (self = [super init]) {
  12. _age = age;
  13. }
  14. return self;
  15. }
  16. @end
  17. int main()
  18. {
  19. // 创建一个Person类的对象,调用重新设计的构造方法并传入赋给_age的值
  20. Person *p = [[Person alloc] initWithAge:23];
  21. // 输出_age的值
  22. NSLog(@"_age = %d", p.age);
  23. return 0;
  24. }

上面代码输出结果是:

_age = 23

自定义构造方法的注意点是:

1、以“-”号开头,也就是必须是对象方法。

2、返回值一般是id类型。

3、方法名一般以initWith开头。

下面我们学习子类继承父类时怎么设计构造方法。

[objc] view plaincopy

  1. #import <Foundation/Foundation.h>
  2. // Person类的声明和实现
  3. @interface Person : NSObject
  4. @property int age;
  5. // 设计的构造方法的声明
  6. - (id)initWithAge:(int)age;
  7. @end
  8. @implementation Person
  9. // 设计的构造方法的实现
  10. - (id)initWithAge:(int)age
  11. {
  12. if (self = [super init]) {
  13. _age = age;
  14. }
  15. return self;
  16. }
  17. @end
  18. // Student类的声明和实现
  19. @interface Student : Person
  20. @property double score;
  21. // 设计的构造函数的声明
  22. - (id)initWithAge:(int)age andScore:(double)score;
  23. @end
  24. @implementation Student
  25. // 设计的构造方法的实现
  26. - (id)initWithAge:(int)age andScore:(double)score
  27. {
  28. //调用了父类重新设计的构造方法
  29. if (self = [super initWithAge:age]) {
  30. _score = score;
  31. }
  32. return self;
  33. }
  34. @end
  35. int main()
  36. {
  37. // 创建一个Student类的对象,调用重新设计的构造方法并传入_age和_score的值。
  38. Student *s = [[Student alloc] initWithAge:18 andScore:92];
  39. // 输出_age的值
  40. NSLog(@"_age = %d, _score = %.1f", s.age, s.score);
  41. return 0;
  42. }

上面的代码的重点是在子类的构造方法中调用了父类的构造方法。在设计构造方法中,如果子类需要对父类的成员变量进行初始化且父类中已经定义了对该成员变量初始化的init方法,我们就要调用父类的构造方法。也就是说,父类的属性交给父类来处理,子类的给子类来处理。

以上就是构造方法的简单介绍。我们来总结几个重点:

1、如果需要在初始化的时候就给成员变量赋值,我们就要重写init方法,也就是构造方法。

2、重写构造方法的时候一定要调用父类的构造方法。

3、设计构造方法的时候记得父类的属性交给父类处理。

4、构造方法必须是对象方法。

时间: 2024-10-10 21:52:10

黑马程序员-IOS笔记-封装构造方法的相关文章

黑马程序员-IOS笔记-封装

#import <Foundation/Foundation.h> @interface Student:NSObject { //成员变量尽量不要用@public int age; } /*set方法 作用:提供一个方法给外界,设置age属性值,可以在方法里面对参数过滤 命名规范:1)方法名必须以set开头 2)set后面跟上成员变量的名称,成员变量的首字母必须大写 3)返回值一定是void 4)一定要接收一个参数,而且参数类型跟成员变量类型一致 5)行参的名称不能跟成员变量名一样 */ /

黑马程序员-IOS笔记-Foundation之NSString、NSArray

下面我通过一道编程题:计算文件的代码行数,总结一下NSString.NSArray的使用方法. #import <Foundation/Foundation.h> /* path : 文件的全路径(可能是文件夹.也可能是文件) 返回值 int:代码行数 */ NSUIntegercodeLineCount(NSString *path) { // 1.获得文件管理者 NSFileManager *mgr = [NSFileManagerdefaultManager]; // 2.标记是否为文件

黑马程序员-IOS笔记-继承

#import <Foundation/Foundation.h> /* 1.继承好处: 1)抽取重复代码 2)建立了类之间的关系 3)子类可以拥有父类中的所有成员变量和方法 2.注意点 1)基本上所有的根类都是NSObject */ @interface Animal:NSObject { int _age; double _weight; } -(void)setAge:(int)age; - (int)age; -(void)setWeight:(int)weight; - (int)w

黑马程序员学习笔记-OC之foundation框架

黑马程序员学习笔记-OC之foundation框架 1.简介:foundation框架是其它所有ios框架的基础,包含了很多常用类型,结构体.枚举.类等. 2. 结构体:NSRange表示范围的结构体. NSPoint/CGPoint表示坐标点的结构体 NSSize/CGSize表示宽高的结构体 NSRect/CGRect表示坐标点+宽高的结构体 3. 类字符串:NSString  字符串类 NSMUtableString  易变字符串类 NSArray         数组类 NSMUtabl

黑马程序员学习笔记_OC之给NSString增加分类

---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>.<a href="http://www.itheima.com"target="blank">.Net培训</a>.期待与您交流! ---------------------- 黑马程序员学习笔记_OC

黑马程序员学习笔记2014/7/5

观看视频:011_标识符_黑马程序员_Java基础视频.avi Java语言的基础组成 关键字.标识符.注释.常量和变量.运算符.语句.函数.数组.   关键字     标识符 1.在程序中自定义的一些名称 2.由26个英文字母大小写,数字,0-9符号 :_ $ 组成 3.定义合法标识符的规则: a.数字不可以开头 b.不可以使用关键字 4.Java中严格区分大小写 5.注意:在起名的时候尽量起一个有意义的名称       观看视频:012_常量_黑马程序员_Java基础视频 常量与变量 Jav

黑马程序员学习笔记-C指针小结

黑马程序员学习笔记-C指针 1. 指针简介: 指针是C语言中非常重要的数据类型,是C语言的精华 2. 指针变量定义: 格式:类名标识符 *指针变量名; 指针变量只能存储地址 指针就一个作用:能够根据一个地址值,访问对应的存储空间 指针变量p前面的int:指针变量只能指向int类型的数据 3.实例: 4. 注意点: 指针变量只能存储地址.指针变量未经初始化,不要拿来间接访问其他存储空间.指针变量的初始化可以int *p = &a;也可以拆分成两句:int *p; p =&a;.定义变量时的*

黑马程序员 ——ios点语法和类的三大特性

@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css); @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css); 一.点语法 (一)认识点语法

黑马程序员---ios开发之,property指针在ios5中的一些说明

在iOS开发过程中,属性的定义往往与retain, assign, copy有关,我想大家都很熟悉了,在此我也不介绍,网上有很多相关文章. 现在我们看看iOS5中新的关键字strong, weak, unsafe_unretained. 可以与以前的关键字对应学习strong与retain类似,weak与unsafe_unretained功能差不多(有点区别,等下会介绍,这两个新 关键字与assign类似).在iOS5中用这些新的关键字,就可以不用手动管理内存了,从java等其它语言转过来的程序