是否可以在init中编写nonnull-annotation?

时间:2015-07-13 09:55:00

标签: objective-c nullable init

现在在objective-c中有两个新注释: nonnull nullable
我应该将哪一个用于init方法的返回类型规范?

- (instancetype)init {
    if (self = [super init]) {
        // ...
    }
}

可空的声音
有一个" if"检查[super init]返回什么,并且无法保证它永远不会返回nil。

非空的声音:
当init返回nil并且我从不检查它时,我不知道真实的情况。

2 个答案:

答案 0 :(得分:11)

对于任意类the docs for -init州:

  

返回值:如果由于某种原因无法创建无法导致异常的对象,则为初始化对象或nil

随机类的init方法可以返回nil。如果您从该类的子类返回[super init]的结果,则返回的可能性为nil。如果init方法返回可为空nullable的结果,则应将其[super init]方法适当地注释为init

必须检查每个特定的超类对象的[super init]实现,以确定子类对nil 的调用是否不会返回{{1反过来。

这表示您的方法的注释应为nullable,除非您确认[super init]的结果nil

对于 NSObject 的直接子类,具体为:

  

NSObject类中定义的init()方法不进行初始化;它只是回归自我。在可空性方面,调用者可以假设init()的NSObject实现不返回nil。

因此,对于直接从NSObject继承的类,-init可以标记为nonnull

如果您的班级返回nil:

[super init]的结果可能是nonnull,但是您的班级init的实现会返回nil以响应某些其他条件。

- (instancetype)init {
    if (self = [super init]) { // nonnull

        if (someFailureCondition) {
            return nil; // nullable
        }

    }

    return self;
}

在这种情况下,您的实现当然应该注释nullable

答案 1 :(得分:1)

您可以假设[[NSObject alloc] init]永远不会失败。以下是文档实际说明的内容:

  

NSObject类中定义的init方法不进行初始化;它只是回归自我。在可空性方面,调用者可以假设init的NSObject实现不返回nil。

参考:https://developer.apple.com/reference/objectivec/nsobject/1418641-init?language=objc