NSNotFound的可用性是多少?

这个针对NSNotFound in-Xcode文档非常混乱:

它说“可在iOS 2.0到8.4中使用”和“可用性:iOS 8.1到8.0”。 那么…… 它在8.0之前可用吗? 还是9.0+? 此外,这里发生了什么,如果是的话?

在这里插入availabilityOfNSNotFound == NSNotFound笑话。


在Apple推出强制性64位设备支持(iOS 8.4 SDK?)的某些时候, NSNotFound的声明改为:

 enum {NSNotFound = NSIntegerMax}; 

 static const NSInteger NSNotFound = NSIntegerMax; 

您可以在validation这一点。

文档从未更改过,因此enum NSNotFound的可用性不再在SDK中。 但是从iOS 9及更高版本开始, static const NSInteger NSNotFound可用。

虽然我无法回答NSNotFound的真实可用性,因为我不为Apple工作(作为开发人员,我认为从2.0开始在所有iOS版本中使用都是安全的,否则很多基础类会因为返回NSNotFound而破坏),您可以检查NSNotFound的内存位置是否为NULL:

 #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wtautological-compare" BOOL found = (&NSNotFound != NULL); #pragma clang diagnostic pop if (found) { NSLog(@"meh"); } 

我意识到NSNotFound是一个静态常量,因此设备具有什么操作系统并不重要,因为编译后该值不应该改变。

为了证实这一点,我创建了最简单的文件并查看了它的编译程序集(没有优化):

左:原始C源代码。 右: LLVM汇编输出。

显示NSNotFound的插图在编译时被替换为其绝对值

如您所见, NSNotFound被替换为其绝对值,在本例中为0x7fffffffffffffff因为这是一个64位编译。 对于32位编译,它将是0x7fffffff

这太棒了。 这意味着, 只要它编译,它就会起作用 (假设Apple永远不会改变NSNotFound的值)!

虽然这并不能解释这些奇怪的文档,但它确实提供了一些保证,它应该适用于所有版本的iOS。