OC语言构造方法
一、构造方法
(一)构造方法的调用
完整的创建一个可用的对象:Person * = [Person new];New方法的内部会分别调用两个方法来完成2件事情,1)使用alloc方法来分配存储空间(返回分配的对象);2)使用init方法来对对象进行初始。
可以把new方法拆开如下:
1.调用类方法+alloc分配存储空间,返回未经初始化的对象Person *p1 = [person alloc];2.调用对象方法-init进行初始化,返回对象本身Person *p2 = [p1 init];3.以上两个过程整合为一句:Person *p = [[Person alloc] init];
说明:init方法就是构造方法,是用来初始化对象的方法,注意这是一个对象方法,-减号开头。默认初始化完毕后,所有成员变量的值都为0.
(二)构造方法的代码示例
// 创建一个人类,要求创建出来的所有对象的age的初始值为10
#import <Foundation/Foundation.h>
// Person类的声明
@interface Person : NSObject
@property int age;
@end
// Person类的实现
@implementation Person
// 重写init方法
- (instancetype)init
{
// 1.初始化对象拥有的父类成员变量
if (self = [super init]) {
// 2.初始化对象自有的成员变量
_age = 10;
}
// 3.返回一个已经初始化完成的对象
return self;
}
@end
int main(int argc, char * argv[])
{
Person *p = [[Person alloc] init];
NSLog(@"%d",p.age);
return 0;
}
输出结果为:10
需求2,让学生继承人类,要求学生对象初始化之后,年龄是10,学号是1,怎么办?
// 需求2:创建一个学生类,要求创建出来的所有对象的age初始值为10,学号为1
#import <Foundation/Foundation.h>
// Person类的声明
@interface Person : NSObject
@property int age;
@end
// Person类的实现
@implementation Person
// 重写init方法
- (instancetype)init
{
// 1.初始化对象拥有的父类成员变量
if (self = [super init]) {
// 2.初始化对象自有的成员变量
_age = 10;
}
// 3.返回一个已经初始化完成的对象
return self;
}
@end
// 学生类的声明和事项,学生类继承自人类
@interface Student : Person
@property int no;
@end
@implementation Student
- (instancetype)init
{
// 1.初始化对象拥有的父类成员变量,调用父类的构造方法,把年龄设置为10
if (self = [super init]) {
// 2.初始化对象自有的成员变量,设置no的值为1
_no = 1;
}
// 3.返回一个已经初始化完成的对象
return self;
}
@end
int main(int argc, char * argv[])
{
Student *s = [[Student alloc] init];
NSLog(@"%d,%d",s.age,s.no);
return 0;
}
(三)构造方法使用注意
(1)子类拥有的成员变量包括自己的成员变量以及从父类继承而来的成员变量,在重写够着方法的时候应该首相从父类继承而来的成员变量先进行初始化。(2)原则:先初始化父类的额,再初始化子类的。(3)重写构造方法的目的:味蕾让对象方法创建出来,成员变量就会有一些固定的值。(4)注意点:#1先调用父类的构造方法[super init]; #2再进行了子类内部成员变量的初始化。
二、自定义构造方法
(一)自定义构造方法的规范
(1)一定是对象方法,以减号开头(2)返回值一般式id类型(3)方法名一般以initWith开头
(二)自定义构造方法的代码实现
Person 类的声明,其中声明了两个接收参数的自定义构造方法
#import <Foundation/Foundation.h>
// person类的声明
@interface Person : NSObject
@property NSString *name;
@property int no;
- (instancetype)initWithName:(NSString *)name;
- (instancetype)initWithName:(NSString *)name andNo:(int)no;
@end
Person类的实现
#import "Person.h"
// person类的实现
@implementation Person
// 自定义构造方法
// 接受1个参数的构造方法
- (instancetype)initWithName:(NSString *)name
{
if (self = [super init]) {
_name = name;
}
return self;
}
// 接受两个参数的构造方法
- (instancetype)initWithName:(NSString *)name andNo:(int)no
{
if (self = [super init]) {
_name = name;
_no = no;
}
return self;
}
@end
Student 继承自 Person 类,声明了一个接收了一个接收三个参数的构造方法#import "Person.h"
@interface Student : Person
@property int age;
- (instancetype)initWithName:(NSString *)name andNo:(int)no andAge:(int)age;
Student 类的实现@end
#import "Student.h"
// 学生类方法的实现
// 一个接受三个参数的自定义构造方法
@implementation Student
- (instancetype)initWithName:(NSString *)name andNo:(int)no andAge:(int)age
{
// 调用父类的构造方法初始化两个变量
if (self = [super initWithName:name andNo:no]) {
// 初始化自己独有的成员变量
_age = age;
}
// 返回对象
return self
}
@end
测试主程序
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Student.h"
int main(int argc, const char * argv[])
{
// 调用接受一个参数的自定义构造函数
Person *p = [[Person alloc] initWithName:@"yangyong"];
NSLog(@"%@",p.name);
// 调用接受两个参数的自定义构造函数
Person *p2 = [[Person alloc] initWithName:@"yangyong with", andNo:1];
// 学生类调用接受三个参数的构造函数
Student *s = [[Student alloc] initWithName:@"again" andNo:2 andAge:23];
NSLog(@"%@,%d,%d", s.name, s.no, s.age);
return 0;
}