NSNotFound
ためこの中に、Xcodeのドキュメントはかなり混乱して:NSNotFoundの利用状況は?
それは "8.4経由のiOS 2.0で利用可能" と ":iOSの8.1〜8.0可用性" と言います。だから... それは8.0より前に利用できますか?または9.0 +で?それがあれば、ここで何が起こっているの?
NSNotFound
ためこの中に、Xcodeのドキュメントはかなり混乱して:NSNotFoundの利用状況は?
それは "8.4経由のiOS 2.0で利用可能" と ":iOSの8.1〜8.0可用性" と言います。だから... それは8.0より前に利用できますか?または9.0 +で?それがあれば、ここで何が起こっているの?
availabilityOfNSNotFound == NSNotFound
ジョークをここに挿入します。ある時点で
アップルは必須64ビットデバイスサポート(IOSの8.4 SDK?)をプッシュした場合、NSNotFound
の宣言から変更されました:
static const NSInteger NSNotFound = NSIntegerMax;
に
enum {NSNotFound = NSIntegerMax};
これは<Foundation/NSObjCRuntime.h>
で確認できます。
ドキュメントは変更されていないため、enum
NSNotFound
の可用性は、SDKに含まれていません。しかし、iOS 9以降ではstatic const NSInteger
NSNotFound
が利用可能です。
私は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");
}
ニースが@JALを見つけました! – Alex
私はNSNotFound
が静的定数、値がコンパイル後変更すべきではありませんように、デバイスが持つ一般OSかは重要ではならないことに気づきました。
これを確認するために、私は私ができる最も単純なファイルを作り、(最適化なし)、そのコンパイル済みアセンブリを見た:
左:元のCソースコード。 右: LLVMアセンブリ出力。
あなたが見ることができるように、これは64ビットコンパイルであることから、NSNotFound
この場合0x7fffffffffffffff
には、その絶対値に置き換えられます。 32ビットコンパイルでは、0x7fffffff
となります。
これは素晴らしいです。これは、がコンパイルされている限り、(AppleがNSNotFound
の値を決して変更しないと仮定して)を動作させることを意味します。
これは奇妙なドキュメントを説明するものではありませんが、すべてのバージョンのiOSで動作するはずです。
これまでに見つかったことはありますか?あるいは、異なるバージョンでどのように動作するか見てみましたか?現在のドキュメントでは、 'Availability(8.0 to 8.0)'と書かれています。 – Alex
@Alex私はしていません。私のアプリがサポートしているのは、少なくともiOS 7.2から9.2.1まではうまくいきます。 –
iOS 7.0から9.2.1まで、私にとってはうまく動作するようです。奇妙な。 – Alex