2010-04-14 8 views
3

J'ai une classe appelée Level, qui est une sous-classe de NSObject.Sous-classe Objective-C question

Puis j'ai une classe appelée Level_1_1 qui est une sous-classe de Level.

Est-il permis de taper comme

Level* aLevel = [Level_1_1 alloc]; 

au lieu de

Level_1_1* theLevel = [Level_1_1 alloc]; 

? :)

Je l'essaie et je ne reçois aucun avertissement, je me demandais juste si c'était bon à faire?

Répondre

6

Ceci est autorisé; mais il y a deux choses que vous devez garder à l'esprit:

  1. Jamais, jamais appeler +alloc sans enchaînant avec -init ou un -initWith*, à moins que vous déblayage au sujet de l'exécution.
  2. Vous pourriez vouloir reconsidérer votre conception si vous appelez des classes des choses comme Level_1_1. Vous pourriez, par exemple, avoir une classe Level générique et un certain nombre de données de description de niveau liées, de sorte que vous n'avez pas à coder en dur chaque niveau; rendre des choses pratiquement impossibles à étendre sans un effort massif de votre part.

Retour au point:

SomeClass *aSomeclass = [[MySomeClass alloc] init]; 

est tout à fait acceptable (en supposant MySomeClass hérite de SomeClass). En fait, cela se produit beaucoup sans vous vous en aperceviez: Vous ne, par exemple, en fait obtenir un NSString, même lorsque vous appelez [[NSString alloc] init], comme dans:

// This is an NSConstString masquerading as an NSString 
NSString *aString = @"This is an NSConstString"; 
// This probably gives you an NSConcreteString, or something of the kind 
NSString *anotherString = [NSString stringWithString:aString]; 

Vous pouvez même ajouter un type complètement faux à votre classe. Par exemple.

NSArray *someString = @"Not An Array!"; 
NSLog(@"%s", [someString UTF8String]); // this works, but creates 
             // a compile-time warning 
NSLog(@"%u", [someString count]);  // this creates a runtime error, 
             // but none while compiling 

Ce cas de chaîne est encore parfaitement utilisable, mais le compilateur ne peut vous avertir des erreurs évidentes plus, parce qu'il pense qu'il est un NSArray. De plus, les propriétés d'Objective-C 2.0 ne fonctionneront pas correctement (mais le compilateur vous en avertira.).

+0

Merci beaucoup. ;) Je n'utilise pas alloc, j'utilise new, ce que je suppose être alloc et init dans un. Merci quand même :) –

+2

Alors s'il vous plaît utilisez '# new' dans vos exemples et s'il vous plaît ne supposez pas ce que' # new' fait, mais recherchez dans la documentation. – nils

Questions connexes