NSNotFound的可用性是多少?

时间:2015-10-29 16:16:23

标签: ios foundation code-documentation

NSNotFound的这个in-Xcode文档非常令人困惑:

它说"适用于iOS 2.0到8.4和#34;和"可用性:iOS 8.1到8.0"。所以... 8.0之前可用吗?还是9.0+?此外,这里发生了什么,如果是的话?

2 个答案:

答案 0 :(得分:7)

在此处插入availabilityOfNSNotFound == NSNotFound个笑话。

在Apple推出强制性64位设备支持(iOS 8.4 SDK?)时,NSNotFound的声明已从以下更改:

enum {NSNotFound = NSIntegerMax};

static const NSInteger NSNotFound = NSIntegerMax;

您可以在<Foundation/NSObjCRuntime.h>

中验证这一点

文档从未更改过,因此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");
}

答案 1 :(得分:1)

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

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

左:原始C源代码。 右: LLVM程序集输出。

An illustration showing NSNotFound is replaced with its absolute value at compile time

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

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

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