Cette documentation in-Xcode pour NSNotFound
est assez déroutante:
Il dit "Disponible dans iOS 2.0 à 8.4" et "Disponibilité: iOS 8.1 à 8.0". Alors … Est-ce disponible avant 8.0? Ou dans 9.0+? Aussi, que se passe-t-il ici, si c'est le cas?
Insérez availabilityOfNSNotFound == NSNotFound
blague availabilityOfNSNotFound == NSNotFound
ici.
À un moment où Apple poussait la prise en charge obligatoire des périphériques 64 bits (iOS 8.4 SDK?), La déclaration de NSNotFound
été modifiée:
enum {NSNotFound = NSIntegerMax};
à
static const NSInteger NSNotFound = NSIntegerMax;
Vous pouvez le vérifier dans <Foundation/NSObjCRuntime.h>
.
La documentation n'a jamais été modifiée, de sorte que la disponibilité de NSNotFound
enum
n'est plus dans le SDK. Mais à partir de iOS 9 et au-dessus, le static const NSInteger
NSNotFound
est disponible.
Bien que je ne puisse pas répondre à la véritable disponibilité de NSNotFound
puisque je ne travaille pas pour Apple (en tant que développeur je pense qu'il est sûr d'utiliser toutes les versions iOS depuis 2.0, sinon beaucoup de classs Foundation casseraient puisqu'elles peuvent renvoyer NSNotFound
), vous pouvez vérifier si l'location de memory de NSNotFound
est NULL:
#pragma clang diagnostic push #pragma clang diagnostic ignored "-Wtautological-compare" BOOL found = (&NSNotFound != NULL); #pragma clang diagnostic pop if (found) { NSLog(@"meh"); }
J'ai réalisé que NSNotFound
est une constante statique, et que le operating system ne devrait donc pas avoir d'importance, car la valeur ne devrait pas changer après la compilation.
Pour confirmer cela, j'ai fait le file le plus simple possible et j'ai regardé son assembly compilé (sans optimizations):
À gauche: code source C d'origine. Droite: sortie de l'assemblage LLVM.
Comme vous pouvez le voir, NSNotFound
est remplacé par sa valeur absolue, dans ce cas 0x7fffffffffffffff
puisqu'il s'agit d'une compilation 64 bits. Pour les compilations 32 bits, ce serait 0x7fffffff
.
C'est génial. Cela signifie que, tant qu'il comstack, cela fonctionnera (en supposant qu'Apple ne change jamais la valeur de NSNotFound
)!
Bien que cela n'explique pas la documentation étrange, il rassure que cela devrait marcher sur toutes les versions d'iOS.