目标C中什么是非空的?

时间:2015-06-23 11:51:26

标签: ios objective-c initialization xcode7 ios9

有人可以详细解释为什么在iOS 9中引入了nonnull

例如,NSArray方法+ (instancetype)array;现在是+ (instancetype nonnull)array;

参考: https://developer.apple.com/library/prerelease/ios/releasenotes/General/iOS90APIDiffs/frameworks/Foundation.html

这是一个客观的c级功能,它会如何影响现有的应用程序?

4 个答案:

答案 0 :(得分:17)

他们确保无论类型何处都不可为空,它现在都是nonnull类型。

与之前的NSMutableArray addObject方法一样

- (void)addObject:(ObjectType)anObject  

现在已更改为

- (void)addObject:(ObjectType nonnull)anObject

因此,这意味着您无法将null对象(nil)传递给此方法。同样的,在你的情况下

+ (instancetype nonnull) array

方法永远不会返回nil

参考:https://developer.apple.com/swift/blog/?id=25

答案 1 :(得分:9)

nonnull是一个关键字,用于告诉编译器返回值(或参数或属性)永远不会为nil。这是在早期版本的Xcode中引入的,以便在Obj-C和Swift的可选类型之间实现更好的互操作性。

您可以在the official Swift blog

上详细了解相关信息

答案 2 :(得分:3)

nonnull是一个关键字,它通知编译器object / parameters返回的值永远不会是nil

  

一般来说,你应该大致看待可空和非空的方式   你目前使用断言或例外:违反合同是   程序员错误。特别是,返回值是你的意思   控制,所以你永远不应该返回nil作为不可为空的返回类型   除非是为了向后兼容。

答案 3 :(得分:0)

引入了nullable和nonnull,使Objective C和Swift的互操作性更容易。

目标C在可选参考和非可选参考之间没有任何区别。然后Swift编译器无法确定对Objective C代码的特定引用是否可选。

可空注释与Swift中的可选注释相同。 非空注释与Swift中的非可选注释相同。

经验法则是任何简单的指针类型都将被假定为非空(有关详细信息,请阅读the official Swift blog

我还要说这个新的注释也会从Objective C的角度提高代码质量。我通常想知道如果传递nil作为参数,应用程序会崩溃吗?例如:

id var;
NSMutableArray *a = [NSMutableArray new];
[a addObject:var];

编译器在这种情况下没有说什么,你的应用程序会在执行时间内崩溃!现在使用这个新注释,您将在编译时看到警告。我知道这个例子很愚蠢,但有些情况下你不知道在调用方法之前是否需要检查属性是否为nil,除非你阅读文档。