2010-06-11 4 views
1

De the Core Data docs:Alors, où est ce super appel?

Héritage Si vous avez deux sous-classes de NSManagedObject où la classe parent implémente une propriété dynamique et sa sous-classe (le petit-fils de NSManagedObject) l'emporte sur les méthodes pour la propriété, les remplacements ne peut pas appeler super.

@interface Parent : NSManagedObject 
@property(nonatomic, retain) NSString* parentString; 
@end 

@implementation Parent 
@dynamic parentString; 
@end 

@interface Child : Parent 
@end 

@implementation Child 
- (NSString *)parentString 
{ 
    // this throws a "selector not found" exception 
    return parentString.foo; 
} 
@end 

très, très drôle, parce que: Je ne vois personne un appel à super. Ou sont-ils? Attendez ... parentString.foo aboutit à ... un crash ??? c'est une chaîne. Comment cette chose peut-elle avoir un suffixe .foo? Juste un autre bug de la documentation?

+0

Je l'ai marqué pour les commentaires sur Apple. Vous devriez le faire aussi. – TechZen

+0

comment et où? aimerait le faire, si cela ne prendrait pas toute la journée pour trouver la bonne personne de contact;) – dontWatchMyProfile

Répondre

1

Je pense que l'exemple est tronqué.

Je suis à peu près sûr que le problème d'héritage est dû au fait que les méthodes @dynamic sont créées par le moteur d'exécution. Le compilateur n'essaie pas de créer un symbole pour eux. Si la classe parente n'est pas instanciée, je ne pense pas que les méthodes existent même du tout. Par conséquent, il est vraiment impossible pour une instance de sous-classe d'avoir un sélecteur/symbole en cours d'appel.

C'est un compromis nécessaire pour la génération automatique de code d'exécution.