init 方法

  1. @interface NSObject <NSObject> {
  2. Class isa OBJC_ISA_AVAILABILITY;
  3. }
  4. - (instancetype)init

重写init方法

如果我们想要让创建对象属性的默认值不是 nil / NULL / 0 ,而是我们自定义的,那么这个时候,我们就可以重写init方法,在这个方法中按照我们自己的想法为对象的属性赋值。

重写init方法的规范

  • 必须先调用父类的init方法,然后将方法的返回值赋给self。
  • 调用init方法初始化对象有可能会失败,如果初始化失败,返回的就是nil。
  • 判断父类是否初始化成功。

    重写init方法的代码

    ```objectivec
  • (instancetype)init { self = [super init]; if (self) {
      //自定义赋值操作
    
    } return self; } ```

为什么要调用父类的init方法

因为父类的init方法,会初始化父类的属性,所以必须要保证当前对象当中的父类属性也同时被初始化。

重写init方法的缺点

重写init方法的缺点是,每次创建出来的对象属性是一样的。
我们希望,创建对象的时候,对象的属性值是由创建对象的人来指定,而不是写死在init方法中。

自定义构造方法

当系统提供的init方法不能满足需求时,我们可以自定义构造方法,传入自己想要的参数

自定义构造方法的规范

  • 返回值必须是instancetype
  • 自定义构造方法的名称以initWith开头.
  • 方法的实现和init的要求一样。

自定义构造方法的代码

- (instancetype)initWithName:(NSString *)name andAge:(int)age
{
  if(self = [super init])
  {
    self.name = name;
    self.age = age;
  }
  return self;
}

init和initialize

iOS Objective-C 中的 initialize 和 init 的介绍