我们在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: "")
    }
}

Objective-c相关问答推荐

在没有for循环的情况下获取另一个数组中每个对象的属性值数组

如何以编程方式获取iphone的IP地址

UITableViewCell:如何防止蓝色 Select ​​背景不带 isSelected 属性?

Objective C for循环中断并继续

如何将 NSMutableArray 中的字符串按字母顺序排序?

观察 UIDatePicker 的变化

在 iOS 7 中检测后台应用刷新的用户设置

iPhone - 时区便利方法之间的差异

iOS:如何将 UIViewAnimationCurve 转换为 UIViewAnimationOptions?

Cocoa 与 Cocoa Touch - 有什么区别?

iPhone 上 SQLite 的最佳 Cocoa/Objective-C 包装器库

iPhone:在 UITextField 上禁用 Auto-Cap/autocorrect 问题

如何将 nil 添加到 nsmutablearray?

如何为 iPhone 应用程序创建多个主题/皮肤?

zoom UIView 及其所有子项

为什么 detailTextLabel 不可见?

iPhone SDK:如何在视图中播放视频?而不是全屏

如何调整 UITableView 中原型单元格的左边距?

状态栏文本 colored颜色 iOS 7

UITableView,我如何知道 cellForRowAtIndexPath 期间的哪个部分?