构造方法
一,概念相关。
构造方法其实就是-init方法。
例:完整的创建一个可用的对象:Person *p = [Person new];
New方法创建的内部拆分原理,分为两部分,分别完成两部份的事情:
1,分配内存
+alloc方法/类方法
Person *p1 = [Person alloc];
2,初始化
-init方法/对象------它初始化结束后默认为0
Person *p1 = [p1 init];
合成一句后,先给对象分配内存再初始化:
Person *p = [[Person alloc] init];
代码说明:
如果我想要每个对象创建出来后,初始值是10,而不是0.
#import <Foundation/Foundation.h>
@interface Person : NSObject
@property int age;
@end
@implementation Person
//重写构造方法,init
- (id)init
{
//要调用回super父类的init方法,声明父类中的成员变量和一些其它属性。
//self = [super init]; 可以当作是固定写法
//如果对象初始化成功,才有必要进行下一步操作
// if(self != nil)
if(self = [super init])
{
_age = 10;
}
return self; //返回一个初始化的值
}
@end
int main()
{
//Person *p = [Person new];
//开发中很少用,因太死板
/*
new完整的可以分为两步
1,分配存储空间 +alloc 类方法
2,初始化 -init再调用这就可以用
*/
//开发中有可能用其它方法进行初始化,所以一般用alloc不用init
Person *p = [[Person alloc] init];
NSLog(@"%d", p.age);
return 0;
}
如果我想要每个对象创建出来后,初始值年龄是10,学号是1.
#import <Foundation/Foundation.h>
@interface Person : NSObject
@property int age;
@end
@implementation Person
//重写构造方法,init
- (id)init
{
//要调用回super父类的init方法,声明父类中的成员变量和一些其它属性。
//self = [super init]; 可以当作是固定写法
//如果对象初始化成功,才有必要进行下一步操作
// if(self != nil)
if(self = [super init])
{
_age = 10;
}
return self; //返回一个初始化的值
}
@end
//学生类继承人类,学生类声明和实现
@interface Student : Person
@property int no;
@end
@implementation Student
- (id)init
{
if(self = [super init])
{
//设置no == 1;
_no = 1;
}
//返回一个已经初始化完成的对象
return self;
}
@end
int main()
{
//Person *p = [Person new];
//开发中很少用,因太死板
/*
new完整的可以分为两步
1,分配存储空间 +alloc 类方法
2,初始化 -init再调用这就可以用
*/
//开发中有可能用其它方法进行初始化,所以一般用alloc不用init
Student *p = [[Student alloc] init];
NSLog(@"%d,%d", p.age,p.no);
return 0;
}
使用注意
1,子类拥有自己的成员变量和从父类继承来的成员变量,在重写构造方法的时候,应该是先初始化父类再初始子类。
2,原则是先初始化父类,再初始化子类
3,重写构造方法的目的:创建对象出来,成员变量就有一个固定的值
4,注意:调用父类构造方法[super init], 再进行子类成员变量初始化。
自定义构造方法
一,格式
1,一定是对象方法,减号开头
2,返回值一般是id
3,方法名一般initWith开头
二,代码说明
Person的声明
#import <Foundation/Foundation.h>
@interface Person : NSObject
@property NSString *name;
@property int no;
- (id)initWithName:(NSString *)name;
- (id)initWithName:(NSString *)name andNo:(int)no;
@end
Person的实现
#import "Person.h"
@implementation Person
//接收一个参数的构造方法
- (id)initWithName:(NSString *)name
{
if( self = [super init])
{
_name = name;
}
return self;
}
//接收两个参数的构造方法
- (id)initWithName:(NSString *)name andNo:(int)no
{
if(self = [super init])
{
_name = name;
_no = no;
}
return self;
}
@end
Student的声明
#import "Person.h"
@interface Student : Person
@property int age;
- (id)initWithName:(NSString *)name andNo:(int)no andAge:(int)age;
@end
Student的实现
#import "Student.h"
@implementation Student
- (id)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()
{
//调用自定义构造函数,并接收一个参数。
Person *p = [[Person alloc] initWithName:@"ywf"];
NSLog(@"%@",p.name);
//调用自定义构造函数,并接收两个参数。
Person *p1 = [[Person alloc] initWithName:@"ywf" andNo:1];
NSLog(@"%@ %d",p1.name,p1.no);
//学生类调用接受三个参数的构造方法
Student *s = [[Student alloc] initWithName:@"ywf" andNo:1 andAge:100];
NSLog(@"%@ %d %d",s.name,s.no,s.age);
return 0;
}
使用注意
1,自己做自己的事情。
2,父类的方法给父类来处理,子类的方法处理自己的属性。