2009-04-25 3 views
2

Est-il préférable d'utiliser id ou NSSomeObject * lorsque cela est possible? Je sais que le compilateur peut mieux vérifier quand c'est explicite, mais je me demandais juste quelle est la meilleure pratique.(id) vs (NSSomeObject *) dans Objective-C/Cocoa?

.: par exemple

- (IBAction)someButton:(id)sender 

contre

- (IBAction)someButton:(NSButton *)sender. 

Y a-t-il des avantages à l'un de ces?

Répondre

1

Si vous utilisez - (IBAction)someButton:(id)sender, vous pouvez avoir un NSNotification ou un autre événement appeler comme un sélecteur. Alors que dans votre second cas, seul un NSButton * pourra utiliser cette méthode.

Quant à savoir si autoriser plusieurs types d'objets à appeler une action est une bonne pratique, je ne suis pas positif. Mais je l'utilise parce que je peux écrire et déboguer moins de code.

+0

Non true. Si vous laissez la déclaration en tant que NSButton *, le compilateur vous avertira si vous essayez de passer une instance d'objet d'un type différent, mais comme les méthodes Objective-C sont en retard, tout objet répondant aux sélecteurs appropriés (méthodes) fonctionnera lors de l'exécution. –

+0

Vous n'avez pas besoin de réellement passer le self comme argument pour un IBAction - c'est juste un argument normal. Heck, dans la plupart des cas, vous pouvez simplement passer nul en tant qu'expéditeur de toute façon. – Chuck

+1

ou déclarez la méthode comme '- (IBAction) someButton', ce qui est correct dans de nombreux cas. –

1

J'aime utiliser les classes spécifiques. Objective-C ne vous oblige pas à écrire le bon type car c'est un langage dynamique, mais le compilateur peut vous avertir de certaines erreurs évidentes.

En outre, les propriétés d'Objective-C 2.0 ne fonctionnent pas avec le type id.


Dans votre exemple précis avec le IBAction j'utiliser id, parce qu'une action devrait être appelable de quoi que ce soit, non seulement des boutons.

1

Je sais que le compilateur peut faire mieux vérifier quand il est explicite, mais je me demandais ce qui est mieux pratique.

Le typage explicite (= nommer le type précis de votre objet) est votre ami. Lorsque le compilateur peut mieux vérifier, il va attraper plus d'erreurs pour vous. Seulement lorsque vous vous trouvez trop limité par une saisie explicite, utilisez le type id (= duck typing).

+0

Les deux réponses ci-dessus fournissent des raisons d'utiliser (id) plutôt qu'un type d'objet spécifique. –

+0

Bien sûr. Je viens de dire qu'il est préférable d'utiliser le typage statique, jusqu'à ce que vous ayez une bonne raison de faire autrement. – zoul

+0

+1 très synthétique! –

1

Il est recommandé d'utiliser le type le plus explicite possible afin que le compilateur puisse vous aider à détecter les erreurs les plus élémentaires. La sécurité que vous gagnez est vraiment minime, cependant. Il est beaucoup plus important que vous ayez des tests unitaires adéquats pour détecter les erreurs de niveau supérieur qui vous obligeraient à passer un type d'instance inattendu à la méthode.