构造方法


  1. new方法实际上是一个类方法,new方法的作用:
  • 创建对象->初始化对象->把对象的地址返回
  1. new方法的内部,其实是先调用的alloc方法,再调用的init方法
  • alloc方法是一个类方法,作用:那一个类调用这个方法,就创建那个类的对象,并把对象返回。
  • init方法是一个对象方法,作用:初始化对象,为属性赋初始值(一定要初始化对象)
person *p1 =[person new]
//等价于
person *p1 = [[person alloc] init]
  1. 重写init 为对象赋值
  2. 重写init方法的规范
  • 必须要先调用父类的init方法,然后将方法的返回值赋值给self
  • 调用init方法初始化对象有可能会失败,如果初始化失败,返回的是nil
  • 判断父类是否初始化成功,判断self的值是否为nil,如果不为nil说明初始化成功
  • 如果初始化成功,就初始化当前对象的属性
  • 最后,返回self的值
-(instancetype)init
{
    self = [super init];
    if (self !=nil) {
        self.age =17;
    }
    return self;
}
  1. 解惑
  • 为什么要调用父类的init方法。 因为父类的init方法,会初始化父类的属性,所以必须要保证当前对象中的父类属性也同时被初始化

  • 为什么要赋值给self 因为调用父类的init方法,会返回初始化的对象,实际上返回的就是当前对象,但是我们要判断是否初始化成功

  1. 什么时候需要重写init方法
  • 如果你希望创建出来的对象的属性的默认值不是nil NULL 0,而是我们指定的值,那么这个时候我们就可以重写init方法
  1. 创建对象的时候,对象的属性的值由创建对象的人来指定,而不是写死在init之中。这个时候就用自定义构造方法。
  • 规范:
  • 自定义构造方法的返回值必须是instancetype
  • 自定义构造方法的名称必须以initWith开头
  • 方法的实现和init的要求一样
//实现
- (instancetype)initWithName:(NSString *)name andAge:(int)age
{
    if (self =[super init]) {
        self.name = name;
        self.age = age;
    }
    return self;
}
//调用
    Person *d1 = [[Person alloc] initWithName:@"小明" andAge:16];
学习