designated initializers

Objective-C
一个对象可以有多个构造方法

指定构造器(Designated Initializers)
必须调用父类的指定构造器

便利构造器(Convenience Initializers)
必须调用指定构造器

iOS8后在指定构造器后添加宏`NS_DESIGNATED_INITIALIZER`,跟编译器指明哪个是指定构造器

Profile.h

1
2
3
4
5
6
7
8
9
10
11
#import <Foundation/Foundation.h>

@interface Profile : NSObject

@property (nonatomic, copy) NSString *name;

- (instancetype)init;

- (instancetype)initWithName:(NSString *)name NS_DESIGNATED_INITIALIZER;

@end

Profile.m

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#import "Profile.h"

@implementation Profile

- (instancetype)init {
// 必须调用指定构造器
return [self initWithName:@"Unknown"];
}

- (instancetype)initWithName:(NSString *)name {
// 必须调用父类的指定构造器
self = [super init];
if (self) {
_name = [name copy];
}
return self;
}

@end

参考:
http://useyourloaf.com/blog/xcode-6-objective-c-modernization/
http://stackoverflow.com/questions/26185239/ios-designated-initializers-using-ns-designated-initializer
http://honglu.me/2015/09/16/Objective-C%E5%BE%88%E6%9C%89%E7%94%A8%E7%9A%84%E7%89%B9%E6%80%A7/
http://www.starfelix.com/blog/2014/04/13/zheng-que-bian-xie-designated-initializerde-ji-ge-yuan-ze/