iOS 指定初始值设定项︰ 使用 NS_DESIGNATED_INITIALIZER

发布时间: 2017/3/28 21:24:11
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我们有这个新的宏被介绍在 XCode 6: NS_DESIGNATED_INITIALIZER

在网上,搜索,但真的找不到任何好的文档关于如何使用这个。

在语法上,我们可以使用它像︰

- (instancetype)initWithCoder:(NSCoder *)coder NS_DESIGNATED_INITIALIZER;

但什么是标记使用该宏,初始值设定项的可能优点,也有哪些的事我们应该注意在时使用这?

主要非常感兴趣此宏的用例。任何链接 / 文档将不胜感激。

解决方法 1:

使用 NS_DESIGNATED_INITIALIZERhttp://useyourloaf.com/blog/2014/08/19/xcode-6-objective-c-modernization.html很好地解释︰

指定初始值设定项保障对象完全初始化通过发送初始化消息到超类。实现细节变得重要到类的用户当他们子类它。指定初始值设定项详细的规则︰

  • 指定的初始值设定项必须 (通过超级) 调用超类的指定初始值设定项。NSObject 是这只是的超类的地方 [超级 init]。
  • 任何方便初始值设定项必须在类-最终导致指定初始值设定项中调用另一个初始值设定项。
  • 具有指定初始值设定项的类必须实现所有的指定初始值设定项的超类。

作为一个例子,如果你的界面有

@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;
}

Swift 关于规则指定初始值设定项方便,要求更加严格,如果你混合 Objective-CSwift 代码,标记指定 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: "")
    }
}
官方微信
官方QQ群
31647020