我们在XCode 6中引入了这个新宏:NS_指定的_初始值设定项
我在网上搜索过,但找不到任何关于如何使用这个的好文档.
在语法上,我们可以这样使用它:
- (instancetype)initWithCoder:(NSCoder *)coder NS_DESIGNATED_INITIALIZER;
但是,用这个宏标记初始值设定项可能有什么好处?使用这个宏时,我们应该注意哪些方面?
我主要对这个宏的用例感兴趣.任何链接/文件都将不胜感激.
我们在XCode 6中引入了这个新宏:NS_指定的_初始值设定项
我在网上搜索过,但找不到任何关于如何使用这个的好文档.
在语法上,我们可以这样使用它:
- (instancetype)initWithCoder:(NSCoder *)coder NS_DESIGNATED_INITIALIZER;
但是,用这个宏标记初始值设定项可能有什么好处?使用这个宏时,我们应该注意哪些方面?
我主要对这个宏的用例感兴趣.任何链接/文件都将不胜感激.
NS_DESIGNATED_INITIALIZER
的用法在http://useyourloaf.com/blog/2014/08/19/xcode-6-objective-c-modernization.html中有很好的解释:
指定的初始值设定项保证对象完全初始化
- 指定的初始值设定项必须(通过super)调用指定的初始值设定项
- 任何方便的初始值设定项都必须调用另一个初始值设定项
- 具有指定初始值设定项的类必须实现所有
例如,如果您的界面
@interface MyClass : NSObject
@property(copy, nonatomic) NSString *name;
-(instancetype)initWithName:(NSString *)name NS_DESIGNATED_INITIALIZER;
-(instancetype)init;
@end
然后编译器判断(方便)初始值设定项init
是否调用
-(instancetype)init
{
self = [super init];
return self;
}
这样就可以了:
-(instancetype)init
{
self = [self initWithName:@""];
return self;
}
Swift年来,关于指定和方便初始值设定人的规定更加严格,
例如,此Swift子类将导致编译器错误:
class SwClass: MyClass {
var foo : String
init(foo : String) {
self.foo = foo
super.init()
}
}
这样就可以了:
class SwClass: MyClass {
var foo : String
init(foo : String) {
self.foo = foo
super.init(name: "")
}
}