一、构造方法
1、什么是构造方法
完整地创建一个对象分为2步:
- 为这个对象分配存储空间 +alloc
- 初始化对象 -init
构造方法:用来初始化对象的方法,称之为构造方法(init方法)
eg:
// 分配存储空间 Person *p1 = [Person alloc]; // 初始化对象 Person *p2 = [p1 init];
2、重写init方法
重写init方法的目的:对象一经创建,属性就给赋值(不为0)
重写init方法的注意点:
- 在实现中必须调用父类的init方法即[super init]
- 判断self = [super init]是否为0
- 对象方法
代码实现如下:
// 在Person的implementation中重写init方法 - (id)init { if(self = [super init]) { // 初始化年龄为100 _age = 100; } return self; }
3、自定义构造方法
自定义构造方法的使用场合:初始化对象的时候带参数,将参数赋值为成员变量
自定义构造方法的注意点:同样需要调用父类的init方法
补充:对应类实现对应的功能,比方说,有一个Person类和一个Student类,Person类是Student类的父类,Person类中有属性姓名、年龄,Student类中有新定义的属性学号,Person类中实现了自定义的构造方法创建一个对象的同时给成员变量姓名、年龄赋值。如果现在要求我们实现一个构造方法,对象一经创建的时候,它的姓名、年龄、学号都给赋予对应的值。这时候后我们就给在Student类的构造方法中调用父类的自定义的构造方法来实现设置姓名和年龄的目的,而不需要通过set方法来实现。
二、分类(Category)
1、基本用途
在不改变原来类模型的前提下,给类扩充方法(category)
2、格式
- 分类的声明:@interface 类名 (分类名称)
- 分类的实现:@implementation 类名 (分类名称)
代码实现如下:
// 给Person类添加一个NewAdd的分类 @interface Person (NewAdd) // ... @end @implementation Person (NewAdd) //.... @end
3、注意点
- Category可以访问原始类的实例变量,但是不能添加变量,只能添加方法。如果想添加变量,可以考虑通过继承创建子类
- Category可以实现原始类的方法,但不推荐这么做,因为分类中方法的优先级是最高的,这样会导致原始类中方法一直调用不到
- 多个Category中如果实现了相同的方法,只有最后一个参与编译的才会有效
4、实战演练
分类使用比较多得一个场景就是为系统自定义类扩充方法,下面将用分类为NSString类扩充一个方法来实现返回字符串中0~9的个数的功能
eg
@interface NSString (NewAdd) // 设计一个对象方法返回当前字符串中0~9的个数 - (int)getNumber; @end @implementation NSString (NewAdd) - (int)getNumber { // 数字个数 int count = 0; // 遍历字符串 for(int i = 0; i<self.length; i++) { // 取出对应位置的字符 unichar c = [str characterAtIndex:i] // 判断是否为0`9数字 if( c>='0' && c<='9') { count++; } } return count; } @end