目标C中什么是非空的?

有人可以详细说明为什么在iOS 9中引入nonnull

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

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

这是一个客观的C级function,这将如何影响现有的应用程序?

他们确信,无论哪种types都不可空,它现在是一个nonnull空types。

像之前的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

nonnull是一个关键字,告诉编译器返回值(或参数或属性)永远不会是零。 这是在以前版本的Xcode中引入的,以便在Obj-C和Swift的可选types之间实现更好的交互性。

你可以在官方的Swift博客上了解更多

nonnull是关键字,通知编译器由对象/参数返回的值永远不会nil

一般来说,你应该大体上看你可以使用断言或exception的方式为空和非空:违反合同是程序员的错误。 特别的,返回值是你控制的东西,所以你不应该为非空的返回types返回nil,除非它是为了向后兼容的。

已经引入可空和非空来使Objective C和Swift的互操作性更容易。

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

可空注释与Swift中的可选注释相同。 在Swift中,nonnull注释和non-optional是一样的。

经验法则是任何简单的指针types将被假定为非空(更多细节请阅读官方的Swift博客 )

我也会说,这个新的注释也将从Objective C的angular度来提高代码质量。 我通常不知道应用程序崩溃,如果通过零参数? 例如:

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

编译器在这种情况下不会说任何东西,你的应用程序会在执行时崩溃! 现在有了这个新的注释,你将在编译时看到一个警告。 我知道这个例子是愚蠢的,但是有些情况下,除非你阅读文档,否则在调用方法之前,你不知道是否需要检查一个属性是否为零。