在OC中init开头的方法, 我们称之为构造方法
构造方法的用途: 用于初始化一个对象, 让某个对象一创建出来就拥有某些属性和值
重写init方法, 在init方法中初始化成员变量
注意: 重写init方法必须按照苹果规定的格式重写, 如果不按照规定会引发一些未知的错误
1.必须先初始化父类, 再初始化子类
2.必须判断父类是否初始化成功, 只有父类初始化成功才能继续初始化子类
3.返回当前对象的地址
#import "Person.h"
@implementation Person
/*
第一种写法:
- (instancetype)init
{
// 1.初始化父类
// 只要父类初始化成功 , 就会返回对应的地址, 如果初始化失败, 就会返回nil
// nil == 0 == 假 == 没有初始化成功
self = [super init];
// 2.判断父类是否初始化成功
if (self != nil) {
// 3.初始化子类
// 设置属性的值
_age = 6;
}
// 4.返回地址
return self;
}
*/
/*
第二种写法:
- (instancetype)init
{
self = [super init]; // self == nil == 0
if (self) {
// 初始化子类
_age = 6;
}
return self;
}
*/
//第三种写法:常用的写法
- (instancetype)init
{
// self = [super init];
// 注意: 不要把 = 号写为 ==
// 一定要将[super init]的返回值赋值给self
if (self = [super init]) {
// 初始化子类
_age = 6;
}
return self;
}
@end
例子:
Person.m
#import "Person.h"
@implementation Person
- (instancetype)init
{
if (self = [super init]) {
_age = 10;
}
return self;
}
- (NSString *)description
{
return [NSString stringWithFormat:@"age = %i", _age];
}
@end
Studnet.m
#import "Studnet.h"
@implementation Studnet
- (instancetype)init
{
if (self = [super init]) {
//注意:这里不能直接访问父类的_age属性,因为被@property生成的成员变量是私有变量(和private不同的)只能在自己的那个类中可见和访问,才其他类中不可见,更不能直接访问了。所以这里想给_age赋值可以用self调用_age的setter方法。
// [self setAge:10];不过这里不用调用setter方法因为super就是父类,父类中已经初始化_age了
_no = 1;
}
return self;
}
- (NSString *)description
{
return [NSString stringWithFormat:@"age = %i , no = %i", [self age], _no];
}
@end