2015-10-29 26 views
7

這-Xcode的文檔NSNotFound是相當混亂:NSNotFound的可用性是什麼?

它說 「可用在IOS 2.0 8.4通過」 和 「狀況:iOS的8.1到8.0」。所以... 8.0之前是否可用?或在9.0以上?而且,這裏發生了什麼,如果是這樣?

+0

有沒有發現?或者只是試着看看它在不同版本上的表現如何?目前的文檔現在說'可用性(8.0到8.0)'。 – Alex

+1

@Alex我沒有。看起來它至少在iOS 7.2到9.2.1中工作正常,因爲這是我們的應用程序支持的人。 –

+1

似乎從iOS 7.0到9.2.1都適合我。奇怪的。 – Alex

回答

7

插入availabilityOfNSNotFound == NSNotFound笑話在這裏。

enum {NSNotFound = NSIntegerMax}; 

static const NSInteger NSNotFound = NSIntegerMax; 


在當蘋果公司推出強制性的64位器件支持(?的iOS 8.4 SDK)的一些點,的NSNotFound聲明從改變您可以在<Foundation/NSObjCRuntime.h>進行驗證。

該文檔從未更改,因此enumNSNotFound的可用性不再位於SDK中。但從iOS 9及以上版本開始,可以使用static const NSIntegerNSNotFound

儘管我無法回答NSNotFound的真實可用性,因爲我不適用於Apple(作爲開發人員,我認爲從2.0開始,所有iOS版本都可以使用,否則許多Foundation類會因爲可以返回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

很好的發現@JAL! – Alex

1

我意識到NSNotFound是靜態常量,因此它不應該的問題是什麼OS設備由作爲價值不應該編譯後變化。

爲了證實這一點,我做了我可以在簡單的文件,並看着它編譯的程序集(不優化):

左:原來的C源代碼。 右: LLVM組件輸出。

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

正如你所看到的,NSNotFound替換其絕對值,在這種情況下0x7fffffffffffffff,因爲這是一個64位編譯。對於32位編譯,它將是0x7fffffff

這太棒了。這意味着,只要編譯,它就會工作(假設Apple永遠不會改變NSNotFound的值)!

儘管這並沒有解釋奇怪的文檔,但它確實提供了一些保證,它可以在所有版本的iOS上運行。

+0

你真的不應該使用硬編碼值而不是常量。常數是這樣暴露的原因!此外,該值被分配給'NSIntegerMax',並擴展到'LONG_MAX',這可能是平臺相關的。 – JAL

+0

@JAL我認爲你誤解了我。我使用常數!左側窗格是C代碼,右側窗格是編譯器的程序集輸出。 –

+0

我不會誤解你。我只是說使用任何常量都不安全。 – JAL