2012-09-09 2 views
2

Catégories question:Utiliser une catégorie pour remplacer NSURL méthode

Je voudrais placer une catégorie sur NSURL que, entre faire d'autres choses, remplace la méthode de requête pour être en mesure de fournir une chaîne de requête à partir d'une URL n'est pas conforme à la RFC 1808. Est-il légal de faire quelque chose comme ça dans ma catégorie:

- (NSString *)query //real NSURL method 
{ 
    if (stringIsRFC1808) //want to get the default implementation 
      return [super query]; 
    else 
      return somethingElse; //want to get my custom implementation 
} 

grâce

Répondre

6

Le code tel quel n'est pas valide, parce que vous utilisez [super query] - cela ne fait pas tout à fait ce que vous attendez de le faire. Les catégories ne sont pas des superclasses. Ici [super query] va essayer d'appeler - [NSObject query] - BOOM une erreur de sélecteur non reconnu. Si vous utilisez des catégories pour étendre une classe, vous ne serez pas en mesure d'appeler la méthode originale - si vous n'avez pas besoin de cette fonctionnalité, alors utiliser les catégories est bien, si vous en avez besoin, cependant, vous devriez envisager de sous-classer , (encore meilleure composition pour les objets Fondation!) ou en utilisant le runtime Objective-C pour effectuer method swizzling - de cette façon, vous aurez accès à l'implémentation originale de la méthode. Ajoutez votre propre méthode pour ne pas entrer en conflit avec Apple sdk.

+3

Quelle est la raison du downvote? Est-ce que vous me détruisez en série? –

+1

@ H2C03 ressemble à quelqu'un ne vous aime pas aujourd'hui. –

+0

@FilipRadelic oui, pour moi aussi ... J'ai signalé mes amswers de toute façon. Merci aussi à ceux qui l'ont indemnisé. –

2

Vous ne devriez pas utiliser des catégories pour remplacer les méthodes existantes. Les catégories sont utilisées pour améliorer le comportement de la classe sans le sous-classer. (Bien que je pense que vous pouvez le remplacer est fortement découragé par Apple)

2

Considérez quelqu'un dans votre entreprise en utilisant cette catégorie: La première chose qu'il fait est de regarder dans les bibliothèques de développeurs pour savoir ce que cette méthode fait. Après l'importation de votre catégorie, il ne fait plus ce qu'il devrait faire. Apple ne le recommande pas!

Questions connexes