2009-09-22 8 views
0

Je me demande si quelqu'un peut expliquer où je vais mal ici, je crée 2 objets (voiture & moteur) où l'objet voiture contient un pointeur vers l'objet du moteur. Je sais que je manque l'évidence ou que je fais juste une erreur stupide, mais je ne peux pas vraiment mettre le doigt dessus. NB: tout le code fonctionne, à l'exception de la ligne qui est le commentaire ERREUR.Erreur de composition de classe?

// INTERFACE ------------------------------------------------------- ** 
@interface EngineClass : NSObject { 
} 
@end 


@interface CarClass : NSObject { 
    EngineClass *engine; 
} 
- (void)setEngine:(EngineClass *)value; 
@end 


// IMPLEMENT ------------------------------------------------------- ** 
@implementation CarClass 

- (void)setEngine:(EngineClass *)newEngine { 
    if (engine != newEngine) { 
     [engine release]; 
     engine = [newEngine copy]; 
    } 
} 
@end 

@implementation EngineClass 
@end 


// MAIN ------------------------------------------------------------ ** 

#import <Foundation/Foundation.h> 

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

    CarClass *newCar_001; 
    EngineClass *newEngine_001; 

    newCar_001 = [[CarClass alloc] init]; 
    newEngine_001 = [[EngineClass alloc] init]; 

    [newCar_001 setEngine: newEngine_001]; // ERROR 

    // Clean up 
    [newCar_001 release]; 
    [newEngine_001 release]; 
    [pool drain]; 
    return 0; 
} 
// END ------------------------------------------------------------- ** 

l'erreur est ....

course 22/09/2009 13: 41: 05,483 cocoa_engine_TEST [8606: a0f] 22/09/2009 13: 41: 05,485 cocoa_engine_TEST [8606 : a0f] 2009-09-22 13: 41: 05.485 cocoa_engine_TEST [8606: a0f] - [EngineClass copyWithZone:]: sélecteur non reconnu envoyé à l'instance 0x10010c8d0 2009-09-22 13: 41: 05.486 cocoa_engine_TEST [8606: a0f] *** Termination de l'application en raison d'une exception non interceptée 'NSInvalidArgumentException', raison: '- [EngineClass copyWithZone:]: sélecteur non reconnu envoyé à l'instance 0x10010c8d0'

acclamations -Gary-

+0

Quelle est l'erreur? – rein

Répondre

3

A partir de la documentation pour la méthode de copie:

C'est une méthode pratique pour classes qui adoptent le protocole NSCopying . Une exception est levée si il n'y a aucune implémentation pour copyWithZone :.

Avez-vous implémenté copyWithZone?

Et pourquoi copier le moteur alors que vous pourriez simplement le conserver?

- (id)copyWithZone:(NSZone *)zone { 
    EngineClass *engineCopy = [[EngineClass allocWithZone: zone] init]; 
    // copy variables here, deep or shallow 
    return engineCopy; 
} 

Il renvoie un objet conservé, comme devraient le faire les méthodes de copie.

+0

la copie provenait de l'exécution de "Place Accessor Defs dans le Presse-papiers" à partir du menu xcode en utilisant "moteur EngineClass *"; Quant à savoir pourquoi copier plutôt que de conserver, j'ai cru comprendre que -copy s'assure que si quelqu'un passe dans une instance, alors vous faites une copie pour travailler avec incase les changements originaux? Je devine probablement ... – fuzzygoat

+0

S'il y a une raison de travailler avec une copie plutôt qu'avec l'original, alors vous devriez utiliser la copie. Vous devez juste vous rappeler d'implémenter copywithZone dans votre EngineClass. http://developer.apple.com/mac/library/documentation/Cocoa/Reference/Foundation/Protocols/NSCopying_Protocol/Reference/Reference.html –

+0

Bonjour Terry, avez-vous une idée de l'implémentation de copywithZone dans EngineClass? Je suis en train d'apprendre Objective-C (3 semaines) et c'est un peu au-delà de l'endroit où je suis, mais je suis intéressé de trouver pour référence future. – fuzzygoat

Questions connexes