這-Xcode的文檔NSNotFound
是相當混亂:NSNotFound的可用性是什麼?
它說 「可用在IOS 2.0 8.4通過」 和 「狀況:iOS的8.1到8.0」。所以... 8.0之前是否可用?或在9.0以上?而且,這裏發生了什麼,如果是這樣?
這-Xcode的文檔NSNotFound
是相當混亂:NSNotFound的可用性是什麼?
它說 「可用在IOS 2.0 8.4通過」 和 「狀況:iOS的8.1到8.0」。所以... 8.0之前是否可用?或在9.0以上?而且,這裏發生了什麼,如果是這樣?
插入availabilityOfNSNotFound == NSNotFound
笑話在這裏。
enum {NSNotFound = NSIntegerMax};
到
static const NSInteger NSNotFound = NSIntegerMax;
:
在當蘋果公司推出強制性的64位器件支持(?的iOS 8.4 SDK)的一些點,的NSNotFound
聲明從改變您可以在<Foundation/NSObjCRuntime.h>
進行驗證。
該文檔從未更改,因此enum
NSNotFound
的可用性不再位於SDK中。但從iOS 9及以上版本開始,可以使用static const NSInteger
NSNotFound
。
儘管我無法回答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");
}
很好的發現@JAL! – Alex
我意識到NSNotFound
是靜態常量,因此它不應該的問題是什麼OS設備由作爲價值不應該編譯後變化。
爲了證實這一點,我做了我可以在簡單的文件,並看着它編譯的程序集(不優化):
左:原來的C源代碼。 右: LLVM組件輸出。
正如你所看到的,NSNotFound
替換其絕對值,在這種情況下0x7fffffffffffffff
,因爲這是一個64位編譯。對於32位編譯,它將是0x7fffffff
。
這太棒了。這意味着,只要編譯,它就會工作(假設Apple永遠不會改變NSNotFound
的值)!
儘管這並沒有解釋奇怪的文檔,但它確實提供了一些保證,它可以在所有版本的iOS上運行。
有沒有發現?或者只是試着看看它在不同版本上的表現如何?目前的文檔現在說'可用性(8.0到8.0)'。 – Alex
@Alex我沒有。看起來它至少在iOS 7.2到9.2.1中工作正常,因爲這是我們的應用程序支持的人。 –
似乎從iOS 7.0到9.2.1都適合我。奇怪的。 – Alex