我们在XCode 6中引入了这个新宏:NS_DESIGNATED_INITIALIZER

我在网上搜索,但实际上找不到关于如何使用它的任何好的文档。

在语法上,我们可以像这样使用它:

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

但是,用此宏标记一个初始化程序可能有什么好处,以及使用此宏时我们应该注意的是什么?

我主要对该宏的用例感兴趣。任何链接/文档将不胜感激。

最佳答案

http://useyourloaf.com/blog/2014/08/19/xcode-6-objective-c-modernization.html很好地解释了NS_DESIGNATED_INITIALIZER的使用:



例如,如果您的界面是

@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-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: "")
    }
}

关于ios - iOS指定的初始化程序: Using NS_DESIGNATED_INITIALIZER,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26185239/

10-13 08:08