2015-10-29 17 views
7

NSNotFoundためこの中に、Xcodeのドキュメントはかなり混乱して:NSNotFoundの利用状況は?

それは "8.4経由のiOS 2.0で利用可能" と ":iOSの8.1〜8.0可用性" と言います。だから... それは8.0より前に利用できますか?または9.0 +で?それがあれば、ここで何が起こっているの?

+0

これまでに見つかったことはありますか?あるいは、異なるバージョンでどのように動作するか見てみましたか?現在のドキュメントでは、 'Availability(8.0 to 8.0)'と書かれています。 – Alex

+1

@Alex私はしていません。私のアプリがサポートしているのは、少なくともiOS 7.2から9.2.1まではうまくいきます。 –

+1

iOS 7.0から9.2.1まで、私にとってはうまく動作するようです。奇妙な。 – Alex

答えて

7

availabilityOfNSNotFound == NSNotFoundジョークをここに挿入します。ある時点で


アップルは必須64ビットデバイスサポート(IOSの8.4 SDK?)をプッシュした場合、NSNotFoundの宣言から変更されました:

static const NSInteger NSNotFound = NSIntegerMax; 

enum {NSNotFound = NSIntegerMax}; 

これは<Foundation/NSObjCRuntime.h>で確認できます。

ドキュメントは変更されていないため、enumNSNotFoundの可用性は、SDKに含まれていません。しかし、iOS 9以降ではstatic const NSIntegerNSNotFoundが利用可能です。

私はAppleのために働いていないので、NSNotFoundの本当の可用性に答えることはできませんが(開発者としては、2.0以降すべてのiOSバージョンで使用するのが安全だと思います。 return 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

あなたが見ることができるように、これは64ビットコンパイルであることから、NSNotFoundこの場合0x7fffffffffffffffには、その絶対値に置き換えられます。 32ビットコンパイルでは、0x7fffffffとなります。

これは素晴らしいです。これは、がコンパイルされている限り、(AppleがNSNotFoundの値を決して変更しないと仮定して)を動作させることを意味します。

これは奇妙なドキュメントを説明するものではありませんが、すべてのバージョンのiOSで動作するはずです。

+0

あなたは本当に定数の代わりにハードコードされた値を使うべきではありません。このような理由で定数が公開されています。さらに、値は 'NSIntegerMax'に割り当てられます。この値は' LONG_MAX'に展開され、プラットフォームに依存する可能性があります。 – JAL

+0

@ JALあなたは私を誤解していると思います。私は定数を使用しています!左側のペインはCコード、右側のペインはコンパイラのアセンブリ出力です。 –

+0

私はあなたを誤解していません。いずれかの定数を使うのは安全でないと言っているだけです。 – JAL