现在在objective-c中有两个新注释: nonnull 和 nullable 。
我应该将哪一个用于init方法的返回类型规范?
- (instancetype)init {
if (self = [super init]) {
// ...
}
}
可空的声音:
有一个" if"检查[super init]返回什么,并且无法保证它永远不会返回nil。
非空的声音:
当init返回nil并且我从不检查它时,我不知道真实的情况。
答案 0 :(得分:11)
-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
。
[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