前面咱们用OC的类建立对象的时候咱们用的是new方法。其实new方法是一个组合的方法,它是由两个方法组合在一块的,分别是alloc方法和init方法。其中alloc方法是类方法,它是用来给对象分配一个存储空间的,init方法是对象方法,它是用来对对象进行初始化的,init方法也叫作构造方法。xcode
在OC中,咱们一般要重写init方法以便在初始化的时候就给成员变量赋上一些值,因此咱们在建立对象的时候最好不要用new方法,由于这样咱们就不能重写构造方法了。那么怎么重写init方法呢?重写init方法的步骤:函数
一、调用父类的init方法。这是为了先初始化父类中声明的成员变量和其余属性。学习
二、判断对象是否初始化成功,成功的话再对子类的成员变量进行初始化。spa
三、返回初始化的对象。.net
下面咱们建立一个Person类,类中定义了一个int类型的成员变量_age,下面咱们建立一个Person类的对象并对其初始化,使_age的值为20。设计
- #import <Foundation/Foundation.h>
-
- @interface Person : NSObject
- @property int age;
- @end
-
- @implementation Person
- - (id)init
- {
-
- if (self = [super init]) {
- _age = 20;
- }
-
-
- return self;
- }
- @end
-
- int main()
- {
-
- Person *p = [[Person alloc] init];
-
- NSLog(@"_age = %d", p.age);
-
- return 0;
- }
上面是对Person类的p对象进行初始化并使_age的值在初始化完成后就是20。code
重写init方法的注意点:先调用父类的init方法[super init],再对子类的成员变量初始化。对象
那么咱们可不能够不在类中给成员变量赋初值,而是在其余地方赋值呢?blog
在其余地方赋初值的话就要从新定义init方法,下面咱们学习在main函数中传入成员变量的初值。继承
- #import <Foundation/Foundation.h>
-
- @interface Person : NSObject
- @property int age;
-
- - (id)initWithAge:(int)age;
- @end
-
- @implementation Person
- - (id)initWithAge:(int)age
- {
- if (self = [super init]) {
- _age = age;
- }
- return self;
- }
- @end
-
- int main()
- {
-
- Person *p = [[Person alloc] initWithAge:23];
-
- NSLog(@"_age = %d", p.age);
-
- return 0;
- }
上面代码输出结果是:
_age = 23
自定义构造方法的注意点是:
一、以“-”号开头,也就是必须是对象方法。
二、返回值通常是id类型。
三、方法名通常以initWith开头。
下面咱们学习子类继承父类时怎么设计构造方法。
- #import <Foundation/Foundation.h>
-
- @interface Person : NSObject
- @property int age;
- - (id)initWithAge:(int)age;
- @end
- @implementation Person
- - (id)initWithAge:(int)age
- {
- if (self = [super init]) {
- _age = age;
- }
- return self;
- }
- @end
-
- @interface Student : Person
- @property double score;
- - (id)initWithAge:(int)age andScore:(double)score;
- @end
- @implementation Student
- - (id)initWithAge:(int)age andScore:(double)score
- {
-
- if (self = [super initWithAge:age]) {
- _score = score;
- }
- return self;
- }
- @end
-
- int main()
- {
-
- Student *s = [[Student alloc] initWithAge:18 andScore:92];
-
- NSLog(@"_age = %d, _score = %.1f", s.age, s.score);
-
- return 0;
- }
上面的代码的重点是在子类的构造方法中调用了父类的构造方法。在设计构造方法中,若是子类须要对父类的成员变量进行初始化且父类中已经定义了对该成员变量初始化的init方法,咱们就要调用父类的构造方法。也就是说,父类的属性交给父类来处理,子类的给子类来处理。
以上就是构造方法的简单介绍。咱们来总结几个重点:
一、若是须要在初始化的时候就给成员变量赋值,咱们就要重写init方法,也就是构造方法。
二、重写构造方法的时候必定要调用父类的构造方法。
三、设计构造方法的时候记得父类的属性交给父类处理。
四、构造方法必须是对象方法。