我们在 XCode 6 中引入了这个新宏: NS_DESIGNATED_INITIALIZER
我在网上搜索,但找不到任何关于如何使用它的好的文档。
从语法上来说,我们可以这样使用它:
- (instancetype)initWithCoder:(NSCoder *)coder NS_DESIGNATED_INITIALIZER;
但是用这个宏标记初始化器可能有哪些优点,以及在使用这个宏时我们应该注意什么?
我主要对该宏的用例感兴趣。任何链接/文档将不胜感激。
指某东西的用途NS_DESIGNATED_INITIALIZER
很好地解释了http://useyourloaf.com/blog/2014/08/19/xcode-6-objective-c-modernization.html http://useyourloaf.com/blog/2014/08/19/xcode-6-objective-c-modernization.html:
指定的初始化器保证对象被完全初始化
通过向超类发送初始化消息。这
当以下情况时,实现细节对于类的用户来说变得很重要:
他们将其子类化。指定初始化器的详细规则:
- 指定的初始化器必须调用(通过 super)指定的初始化器
超类的初始值设定项。其中 NSObject 是 this 的超类
只是[超级初始化]。
- 任何便利初始化程序都必须调用另一个
类中的初始值设定项 - 最终导致指定的
初始化程序。
- 具有指定初始化器的类必须实现所有
超类的指定初始值设定项。
举个例子,如果你的界面是
@interface MyClass : NSObject
@property(copy, nonatomic) NSString *name;
-(instancetype)initWithName:(NSString *)name NS_DESIGNATED_INITIALIZER;
-(instancetype)init;
@end
然后编译器检查(方便)初始化程序是否init
来电
(指定的)初始值设定项initWithName:
,所以这会导致警告:
-(instancetype)init
{
self = [super init];
return self;
}
这样就可以了:
-(instancetype)init
{
self = [self initWithName:@""];
return self;
}
In Swift关于指定和便利初始化器的规则甚至更加严格,
如果您混合使用 Objective-C 和 Swift 代码,标记指定的 Objective-C 初始值设定项有助于编译器强制执行规则。
例如,这个 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: "")
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)