Quelle est la disponibilité de NSNotFound?

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.

Une illustration montrant NSNotFound est remplacée par sa valeur absolue au moment de la compilation

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.