Est-il possible d'appliquer le type de vérification d'exécution en Objective-C sur le cacao?

StackOverflow https://stackoverflow.com/questions/2039511

Question

Salut je trouve un moyen de faire appliquer la vérification du type d'exécution ou de telles choses en Objective-C sur le cacao.

Ceci est mon exemple de code. Je pensais erreur d'exécution sur les mauvais assignation à la variable « b ». Mais il n'a pas été. Compilé et exécuté sans erreur.

#import <Foundation/Foundation.h>

int main (int argc, const char * argv[])
{
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

 NSArray* a = [NSArray arrayWithObject: @"TEST"]; 
 NSURL* b = [a objectAtIndex:0]; 

    NSLog(@"Is this URL? %i", [b isKindOfClass:NSURL.class]);
    [pool drain];
    return 0;
}

// Console log after program execution:
// 2010-01-11 10:25:02.948 Type Checking[98473:a0f] Is this URL? 0

Je surpris il n'y a pas de vérification de type d'exécution est là. Parce que je les langages de haut niveau tels que VB, C #, Java, ActionScript ... Je ne sais pas langage de bas niveau comme C, donc je ne peux pas sûr que ce soit la bonne façon ... Il était vraiment difficile de comprendre pourquoi il n'y a pas la compilation ou erreur d'exécution. Mais je suis en train de comprendre cela comme une règle naturelle dans le monde réel C. Mais plus forte vérification de type me aidera beaucoup. Même que dans la session de débogage. Est-il possible de le faire?

Et s'il n'y a pas de vérification de type d'exécution, quel type de stratégie de codage et le débogage dois-je utiliser des valeurs mal tapées? Et quel est le compromis entre la vérification du type d'exécution est ou non?

Était-ce utile?

La solution

Objective-C ont le type de compilation vérification des arguments de message et les types de retour, mais il est un peu plus lâche que beaucoup d'autres langues. Une différence majeure est que les classes de collection comme NSArray et NSDictiomary sont génériques. Vous pouvez mettre tout type d'objet dans un NSArray - les éléments ne doivent pas être du même type. Par conséquent, il n'y a pas de type de vérification lors de l'ajout ou l'accès à des éléments.

Il n'y a pas de type d'exécution de vérification pour l'attribution variable. Je crois que c'est un raccourci de performance. En général, ce n'est pas vraiment un problème. Si le mauvais type de valeur est attribué, à une variable, il finira par obtenir envoyé un message, il ne comprend pas, ce qui génère un message d'erreur très utile.

Autres conseils

Eh bien, il est la vérification du type d'exécution, mais il arrive un peu plus tard. Je suppose que vous vous attendez à une sorte d'exception lorsque vous essayez de mettre une instance NSString dans une variable NSURL *. Au lieu de cela, vous aurez l'exception lorsque vous essayez d'appeler des méthodes spécifiques NSURL sur votre instance NSString.

Par exemple, si vous essayez [b isFileURL] vous obtiendrez une exception comme « NSString ne répond pas au sélecteur « isFileURL » ».

Il est également important de comprendre pourquoi il n'y a pas de type de compilation dans votre exemple de vérification. Plus précisément, l'absence de vérification de type compilation est une propriété unique et importante du type de id, qui est ce que revient -objectAtIndex: de NSArray.

Le cadre NSObject souvent crier au scandale quand le type est faux, mais vous pouvez vérifier manuellement le type et lancer une exception:

if (![obj isKindOfClass:SomeObjectClass.class])
  [NSException raise:@"BadTypeException"
    format:@"Bad type at line %d", (int)__LINE__];
[obj xyz];

...

if (![obj conformsToProtocol:@protocol(SomeProtocol)])
  [NSException raise:@"BadTypeException"
    format:@"Bad type at line %d", (int)__LINE__];
[obj abc];

Modifier : Enlevé section précédente affirmant que les appels à des méthodes non existants retour nul ou zéros; comme Mark Bessey dit, une exception est levée (zéro retourné) si un objet non nul ne met pas en œuvre une méthode.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top