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
被替换为其绝对值,在本例中为0x7fffffffffffffff
因为这是一个64位编译。 对于32位编译,它将是0x7fffffff
。
这太棒了。 这意味着, 只要它编译,它就会起作用 (假设Apple永远不会改变NSNotFound
的值)!
虽然这并不能解释这些奇怪的文档,但它确实提供了一些保证,它应该适用于所有版本的iOS。