NS_DESIGNATED_INITIALIZER(Designated Initializers)

每个类可以有多个以init为前缀的初始化方法:

#define NS_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer))

- (instancetype)init;
- (instancetype)initWithName:(NSString *)name NS_DESIGNATED_INITIALIZER;
/*
    init是 convenience initializer方法只是简单的调用initWithName:(指定初始化器),并设置一个默认值。initWithName:进行完整的初始化并调用父类的init方法。
    指定初始化器有以下几个规则:
          1.指定初始化器方法必须调用父类的指定初始化器方法,如果父类为NSObject时调用  
              [super init]。
          2.convenience initializer方法必须调用其他的初始化方法,知道最后指向指定初始化
              器方法。
          3.一个类如果有指定初始化器方法,那么就必须实现所有父类的指定初始化器方法。
*/
- (instancetype)init {
  return [self initWithName:@"Unknown"];
}
- (instancetype)initWithName:(NSString *)name {
  self = [super init];
  if (self) {
    _name = [name copy];
  }
  return self;
}

你可能感兴趣的:(NS_DESIGNATED_INITIALIZER(Designated Initializers))