Recherche…


Syntaxe

  • BOOL havePlutonium = YES; // Assigment direct
  • BOOL fastEnough = (car.speedInMPH> = 88); // Expression de comparaison
  • BOOL fluxCapacitorActive = (havePlutonium && fastEnough); // Expression booléenne
  • id somethingWicked = [witchesCupboard lastObject]; // Récupère un objet non typé
  • id powder = prepareWickedIngredient (quelquechose) // Passe et retour
  • if ([ingrédient isKindOfClass: [classe Toad]]) {// Tester le type d'exécution

BOOL

Le type BOOL est utilisé pour les valeurs booléennes dans Objective-C. Il a deux valeurs, YES et NO , contrairement aux valeurs les plus courantes "true" et "false".

Son comportement est simple et identique à celui du langage C.

BOOL areEqual = (1 == 1);    // areEqual is YES
BOOL areNotEqual = !areEqual    // areNotEqual is NO
NSCAssert(areEqual, "Mathematics is a lie");    // Assertion passes

BOOL shouldFlatterReader = YES;
if (shouldFlatterReader) {
    NSLog(@"Only the very smartest programmers read this kind of material.");
}

Un BOOL est une primitive et ne peut donc pas être stocké directement dans une collection Foundation. Il doit être enveloppé dans un NSNumber . Clang fournit une syntaxe spéciale pour ceci:

NSNumber * yes = @YES;    // Equivalent to [NSNumber numberWithBool:YES]
NSNumber * no = @NO;    // Equivalent to [NSNumber numberWithBool:NO]

L'implémentation BOOL est directement basée sur C's, en ce sens qu'il s'agit d'un typedef du type bool standard C99. Les valeurs YES et NO sont définies respectivement pour __objc_yes et __objc_no . Ces valeurs spéciales sont des instructions intégrées au compilateur introduites par Clang, qui sont traduites en (BOOL)1 et (BOOL)0 . S'ils ne sont pas disponibles, YES et NO sont définis directement sous forme de nombre entier. Les définitions se trouvent dans l’entête d’exécution Objective-C objc.h

id

id est le pointeur d'objet générique, un type Objective-C représentant "n'importe quel objet". Une instance de toute classe Objective-C peut être stockée dans une variable id . Un id et tout autre type de classe peuvent être assignés sans conversion:

id anonymousSurname = @"Doe";
NSString * surname = anonymousSurname;
id anonymousFullName = [NSString stringWithFormat:@"%@, John", surname];

Cela devient pertinent lors de la récupération d'objets à partir d'une collection. Les types de retour des méthodes comme objectAtIndex: sont id pour exactement cette raison.

DataRecord * record = [records objectAtIndex:anIndex];  

Cela signifie également qu'une méthode ou un paramètre de fonction saisi comme id peut accepter n'importe quel objet.

Lorsqu'un objet est saisi en tant id , tout message connu peut lui être transmis: la méthode dispatch ne dépend pas du type de compilation.

NSString * extinctBirdMaybe = 
               [anonymousSurname stringByAppendingString:anonymousSurname];

Un message auquel l'objet ne répond pas réellement provoquera une exception à l'exécution, bien sûr.

NSDate * nope = [anonymousSurname addTimeInterval:10];
// Raises "Does not respond to selector" exception

Protéger contre les exceptions.

NSDate * nope;
if([anonymousSurname isKindOfClass:[NSDate class]]){
    nope = [anonymousSurname addTimeInterval:10];
}

Le type d' id est défini dans objc.h

typedef struct objc_object {
    Class isa;
} *id;

SEL

Les sélecteurs sont utilisés comme identificateurs de méthode dans Objective-C.

Dans l'exemple ci-dessous, il y a deux sélecteurs. new et setName:

Person* customer = [Person new];
[customer setName:@"John Doe"];

Chaque paire de parenthèses correspond à un message envoyé. Sur la première ligne, nous envoyons un message contenant le new sélecteur à la classe Person et sur la deuxième ligne, nous envoyons un message contenant le setName: selector et une chaîne. Le destinataire de ces messages utilise le sélecteur pour rechercher la bonne action à effectuer.

La plupart du temps, la transmission de messages à l'aide de la syntaxe entre parenthèses est suffisante, mais vous devez parfois travailler avec le sélecteur lui-même. Dans ces cas, le type SEL peut être utilisé pour contenir une référence au sélecteur.

Si le sélecteur est disponible à la compilation, vous pouvez utiliser @selector() pour obtenir une référence.

SEL s = @selector(setName:);

Et si vous avez besoin de trouver le sélecteur à l'exécution, utilisez NSSelectorFromString.

SEL s NSSelectorFromString(@"setName:");

Lorsque vous utilisez NSSelectorFromString, veillez à envelopper le nom du sélecteur dans un NSString.

Il est couramment utilisé pour vérifier si un délégué implémente une méthode facultative.

if ([self.myDelegate respondsToSelector:@selector(doSomething)]) {
    [self.myDelegate doSomething];
}

IMP (pointeur d'implémentation)

IMP est un type C faisant référence à l'implémentation d'une méthode, également appelée pointeur d'implémentation. C'est un pointeur sur le début d'une implémentation de méthode.

Syntaxe:

id (*IMP)(id, SEL, …)

IMP est défini par:

typedef id (*IMP)(id self,SEL _cmd,…);

Pour accéder à cet IMP, le message «methodForSelector» peut être utilisé.

Exemple 1:

IMP ImpDoSomething = [myObject methodForSelector:@selector(doSomething)];

La méthode adressée par l'IMP peut être appelée en déréférencant l'IMP.

ImpDoSomething(myObject, @selector(doSomething));

Donc, ces appels sont égaux:

 myImpDoSomething(myObject, @selector(doSomething));
[myObject doSomething]
[myObject performSelector:mySelector]
[myObject performSelector:@selector(doSomething)]
[myObject performSelector:NSSelectorFromString(@"doSomething")];

Exemple: 2:

SEL otherWaySelector = NSSelectorFromString(@“methodWithFirst:andSecond:andThird:");

IMP methodImplementation  = [self methodForSelector:otherWaySelector];

result = methodImplementation( self,
                          betterWaySelector,
                          first,
                          second,
                          third );

NSLog(@"methodForSelector : %@", result);

Ici, nous appelons [NSObject methodForSelector qui nous renvoie un pointeur sur la fonction C qui implémente réellement la méthode, que nous pouvons appeler ensuite directement.

NSInteger et NSUInteger

Le NSInteger est juste un typedef pour un int ou un long selon l'architecture. La même chose vaut pour un NSUInteger qui est un typedef pour les variantes non signées. Si vous vérifiez le NSInteger, vous verrez ce qui suit:

#if __LP64__ || (TARGET_OS_EMBEDDED && !TARGET_OS_IPHONE) || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64
typedef long NSInteger;
typedef unsigned long NSUInteger;
#else
typedef int NSInteger;
typedef unsigned int NSUInteger;
#endif

La différence entre un signe signé et un signe unsigned int ou long est qu’un entier signé ou long peut contenir des valeurs négatives. L'intervalle de l'int est -2 147 483 648 à 2 147 483 647 tandis que le unsigned int a une plage de 0 à 4 294 967 295. La valeur est doublée parce que le premier bit n'est plus utilisé pour dire que la valeur est négative ou pas. Pour une longue et NSInteger sur les architectures 64 bits, la plage est beaucoup plus large.

La plupart des méthodes fournies par Apple renvoient un entier NS (U) au-dessus de l'int normal. Vous recevrez un avertissement si vous essayez de le convertir en un entier normal, car vous perdrez en précision si vous exécutez une architecture 64 bits. Ce n’est pas le cas dans la plupart des cas, mais il est plus facile d’utiliser NS (U) Integer. Par exemple, la méthode count sur un tableau renvoie un NSUInteger.

NSNumber *iAmNumber = @0;

NSInteger iAmSigned = [iAmNumber integerValue];
NSUInteger iAmUnsigned = [iAmNumber unsignedIntegerValue];

NSLog(@"%ld", iAmSigned); // The way to print a NSInteger.
NSLog(@"%lu", iAmUnsigned); // The way to print a NSUInteger.

Tout comme un BOOL, le NS (U) Integer est un type de données primitif, vous devez donc parfois l'envelopper dans un NSNumber, vous pouvez utiliser le @ avant le nombre entier pour le lancer comme ci-dessus et le récupérer en utilisant les méthodes ci-dessous. Mais pour le convertir en NSNumber, vous pouvez également utiliser les méthodes suivantes:

[NSNumber numberWithInteger:0];
[NSNumber numberWithUnsignedInteger:0];


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow