2010-02-26 4 views
1

J'ai une classe 'DOInstance' dont j'hériterai plus tard. Voici sa déclaration:Objectif C: avertissement sur l'annulation de l'init

@interface DOInstance : NSObject { 

} 

- (DOInstance *) initWithSynckey:(NSString *)_synckey; 
@end 

Puis j'ai une sous-classe de DOInstance:

@interface Workflow_Workitem_Header_1px: DOInstance { 

} 
//- (Workflow_Workitem_Header_1px *) initWithSynckey:(NSString *)_synckey; 
@end 

j'aller de l'avant et mettre en œuvre dans le fichier de mise en œuvre:

- (Workflow_Workitem_Header_1px *) initWithSynckey:(NSString *)_synckey { 

    [super initWithSynckey:_synckey]; 
    //.. 
    //.. 
    return self; 
} 

Maintenant, si je ne déclare initWithSynckey: (la déclaration commentée ci-dessus) dans ma déclaration de sous-classe, j'obtiens un avertissement à l'implémentation: "warning: initialisation à partir du type Objective-C distinct". Si je le déclare, cet avertissement disparaît. D'accord.

Déplacement sur:

Je fais plus tard une instanciation de ma sous-classe:

Workflow_Workitem_Header_1px *instance; 
instance = [[Workflow_Workitem_Header_1px alloc] initWithSynckey:@"xxxx"]; 

Maintenant, cela me donne le même avertissement (quel que soit si je déclare la initWithSynckey correspondante: sélecteur dans mon A savoir la sous-classe, "avertissement: initialisation à partir distincte de type Objective-C"..

Qu'est-ce que je fais mal

+0

Oui, je sais que la sous-classe a un nom étrange. Bien qu'il soit écrit à la main actuellement, je m'attends plus tard à ce que la sous-classe soit «générée» en fonction de certaines métadonnées. – ArjunShankar

+0

Donc quand vous instanciez Workflow_Workitem_Header_1px je pense qu'il renvoie déjà le pointeur, donc vous pouvez retirer l'étoile: Workflow_Workitem_Header_1px instance = [[Workflow_Workitem_Header_1px alloc] initWithSynckey: @ "xxxx"]; Est-ce que cela fonctionne? Vous pouvez également essayer de remplacer la valeur de retour du constructeur (Workflow_Workitem_Header_1px *) par id. – Ronald

+0

Vous devez _always_ utiliser des pointeurs avec des classes Objective-C. En fait, vous ne pouvez pas les utiliser, car le compilateur vous dira "error: instance allouée statiquement de la classe Objective-C 'NSString'" ou autre. –

Répondre

2

Méthodes du nom ini? t ... devrait avoir le type de retour (id), pas le type de la classe. Découvrez NSString.h et NSArray.h (parmi d'autres classes) pour des exemples. C'est peut-être ce qui cause votre problème.

+0

Oui, c'était en fait le problème. Je ne le savais pas jusqu'à maintenant. Merci! – ArjunShankar

0

Dans ce cas, la méthode de remplacement doit renvoyer le même type que la déclaration de la superclasse.

DOInstance définit ceci:

- (DOInstance *) initWithSynckey:(NSString *)_synckey; 

si Workflow_Workitem_Header_1px doit ressembler à ceci:

@interface Workflow_Workitem_Header_1px: DOInstance { 
} 
- (DOInstance *) initWithSynckey:(NSString *)_synckey; 
@end 

Chaque fois que vous obtenez l'avertissement "avertissement: initialisation à partir du type Objective-C distinct" vous faites quelque chose en contradiction avec votre frappe: changement d'une signature de méthode, et autres.

+0

J'avais l'impression que cela ne poserait pas de problème car la méthode surchargée renvoie une sous-classe de type utilisée par la définition d'origine. Je l'ai corrigé en ayant chaque niveau de retour (id), tout comme la plupart des classes NS *. – ArjunShankar

+0

Vous renvoyez toujours une instance d'Objective-C et, comme Objective-C est en retard, tant que vous envoyez des messages que le destinataire comprend, tout fonctionne toujours. L'avertissement est là pour vous dire que vous êtes monkeying avec la façon dont vous avez déclaré les types, et le compilateur n'est pas prêt à _guarantee_ que les choses vont fonctionner. Objective-C a une syntaxe _optional_ manifeste. Vous n'avez en fait besoin d'aucune information de type: -foo {return [[NSString alloc] init]} est une méthode parfaitement acceptable. (Eh bien, "aucune information de type" signifie "tout est un identifiant".) –