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

Mik*_*nov 16 nullable objective-c init

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

- (instancetype)init {
    if (self = [super init]) {
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

pka*_*amb 11

对于任意类,状态的文档-init:

返回值:初始化对象,如果由于某些不会导致异常的原因而无法创建对象,则返回nil.

随机类的init方法可以返回nil.如果您[super init]从该类的子类返回结果,则返回的可能性很大nil.您的类应该适当地注释其init方法,就nullable好像它返回可为空的结果一样[super init].

每一个具体的超类对象的init实现必须进行检查,以确定是否该子类的号召,[super init] 还是不会返回nil反过来.

这表明你的方法的注释应该是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;
}
Run Code Online (Sandbox Code Playgroud)

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

  • 从出现[该文档(https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSObject_Class/#//apple_ref/occ/instm/NSObject/init)上述引用文字做个参考`init`方法一般而不是NSObject中的`init`专门为文档上进入状态:"在'NSObject`类中定义的`init`方法确实没有初始化,它只是返回`self`".所以在"NSObject"本身的情况下,这表明`init`不会返回`nil`. (4认同)