0

Созданный после класса Parse's PFQuery, я создаю свой собственный класс EMQuery для моего собственного проекта (не подкласса PFQuery). Мой вопрос: если я хочу выполнить аналогичный вызов метода класса так, как это делает Parse (PFQuery *query = [PFQuery queryWith...]), это будет правильный подход?iOS: Правильный способ инициализации объекта?

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

- (id)initWithQueryType:(EMObjectType)objectType { 

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

    } 

    return self; 
} 

ответ

3

Нет - поскольку вы вызываете init суперкласса дважды.

Ваш initWithQueryType должен заменить вызов инициализации

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

Исключением является, если инициализации в вашем классе что-то делает. В этом случае два inits init и initWithQueryType: следует установить, что один называет другой и один называется единственной, который вызывает super init Это один назначенный инициализатор

Основное объяснение всех инициализации является разделом на объекте Инициализация Apple document

+0

Ahh Я вижу. Отличное объяснение! Спасибо за ссылку. :) – KingPolygon

0

Не вызывайте два метода init; звоните один, один раз. Например:

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

Это не то, что этого достаточно. Вы должны вызывать один и только один метод init. – rmaddy