iOS: 初始化对象的正确方法?

iOS: Proper way of initializing an object?

模仿 Parse 的 PFQuery class,我正在构建自己的 EMQuery class,用于我自己的项目(不是子 class查询)。我的问题是,如果我想以 Parse (PFQuery *query = [PFQuery queryWith...]) 的方式执行对 class 方法的类似调用,这是正确的方法吗?

+ (instancetype)queryWithType:(EMObjectType)objectType {
    EMQuery *query = [[self alloc] init];
    return [query initWithQueryType:objectType];
}

- (id)initWithQueryType:(EMObjectType)objectType {

    self = [super init];
    if (self) {

    }

    return self;
}

否 - 因为您调用了 superclass 的 init 两次。

您的 initWithQueryType 应该替换对 init 的调用

+ (instancetype)queryWithType:(EMObjectType)objectType {
    EMQuery *query = [self alloc];
    return [query initWithQueryType:objectType];
}

例外情况是 class 中的 init 执行某些操作。在那种情况下,两个初始化 initinitWithQueryType: 应该设置为一个调用另一个,被调用的是唯一一个调用 super init 这个是指定的初始化程序

所有初始化的主要解释是关于对象初始化的部分Apple document

不要调用两个init方法;叫一个,一次。像这样:

+ (instancetype)queryWithType:(EMObjectType)objectType {
    EMQuery *query = [[self alloc] initWithQueryType:objectType];
    return query;
}