如果Objective-C编译器认为您可能将nil
传递给标有_Nonnull
的参数,那么它是否会实际警告您?
或者它只是提示在Swift和Objective-C之间转换什么工具来更好地处理Swift选项?
答案 0 :(得分:2)
就其本身而言,只有在非常简单的情况下才会发出警告:当您将nil
传递给接受_Nonnull
值的函数时。
NSObject* _Nonnull test(NSObject* _Nonnull) {
test(nil); // warning
NSObject* _Nullable f = nil;
test(f); // no warning (passing _Nullable to _Nonnull), only warn in static analysis
NSObject* _Nonnull g = [[NSObject alloc] init];
g = nil; // no warning (!) (assigning nil to _Nonnull)
if (g != nil) { // no warning (unnecessary '!= nil' comparison)
test(g);
}
return nil; // no warning (returning nil to _Nonnull)
}
(有一个-Wnullable-to-nonnull-conversion
flag,但它似乎对上面的代码没有任何影响。)
As documented,这三个属性不会改变代码的行为:
...请注意,与声明属性
nonnull
不同,_Nonnull
的存在并不意味着传递null是未定义的行为:fetch
是免费的考虑null未定义的行为或(可能出于向后兼容性原因)防御性处理null 。
除了编译器之外,它还可以帮助静态分析器,但是clang的静态分析器只能抓住那些确定你正在为nil
分配_Nonnull
的琐碎案例。 }(即上面的test(f)
示例)。
尽管如此,将指针_Nonnull
/ _Nullable
标记为