Skip to content

Instantly share code, notes, and snippets.

@arturlector
Last active March 14, 2018 09:00
Show Gist options
  • Save arturlector/ec6f06ba14ba9d175252 to your computer and use it in GitHub Desktop.
Save arturlector/ec6f06ba14ba9d175252 to your computer and use it in GitHub Desktop.
Что такое назначенный инициализатор (designated initializer)?

Что такое назначенный инициализатор?

Назначенный инициализатор (designated initializer) - это главный инициализатор(конструктор), все остальные методы
создающие класс вызывают этот метод.

Как выглядит назначенный инициализатор?

У объектов бывает сразу несколько методов начинающихся с init, например init, initWithName, 
initWithName:balance: и тд

Установившейся практикой в таком случае является выделение среди всех init-методов одного, 
назвыемого designated initializer. Все остальные init-методы должны вызывать его и только он
вызывает унаследованный init-метод.

В нашем случае designated initializer будет -initWithName:balance:
@interface BankAccount : NSObject

//Properties
@property (copy) NSString *name;
@property (copy) NSDecimalNumber *balance;


- (id)initWithName:(NSString *)name;

//Designated initializer
- (id)initWithName:(NSString *)name balance:(NSDecimalNumber *)balance;
@end
@implementation BankAccount

- (id)initWithName:(NSString *)name {
    return [self initWithName:name balance:[NSDecimalNumber zero]];
}

//Designated initializer
- (id)initWithName:(NSString *)name balance:(NSDecimalNumber *)balance {
    if ((self = [super init])) {
        self.name = name;
        self.balance = balance;
    }
    return self;
}

Как обозначать/маркировать назначенный инициализатор?

Используем макрос NS_DESIGNATED_INITIALIZER для маркировки назначенного инициализатора
@interface MyClass : NSObject
@property(copy, nonatomic) NSString *name;
-(instancetype)initWithName:(NSString *)name NS_DESIGNATED_INITIALIZER;
-(instancetype)init;
@end

Иерархия назначенных инициализаторов

Пример назначенного инициализатора

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment