gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 03:16:45 25 4
gpt4 key购买 nike

现在在 objective-c 中有两个新的注释:nonnullnullable
我应该使用它们中的哪一个来指定 init 方法的返回类型?

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

nullable 的语音:
有一个“if”来检查 [super init] 返回什么,但不能保证它永远不会返回 nil。

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

最佳答案

对于任意类the docs for -init状态:

Return Value: An initialized object, or nil if an object could not be created for some reason that would not result in an exception.

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

必须检查每个特定父类(super class)对象的 init 实现以确定子类对 [super init] 的调用可以还是将not 依次返回nil

这表明你的方法的注解应该是nullable,除非你已经确认[super init]的结果不是

对于 NSObject直接子类,具体来说:

The init() method defined in the NSObject class does no initialization; it simply returns self. In terms of nullability, callers can assume that the NSObject implementation of init() does not return 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

关于objective-c - 是否可以在 init 中编写 nonnull-annotation?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31380288/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com