2009-04-07 7 views
1

Je lis le code source d'un projet open source et je l'ai rencontré la définition de la catégorie suivante dans un fichier de mise en œuvre:Pourquoi déclarer une méthode dans une catégorie sans l'implémenter?

@interface QCView (Private) 
- (void)_pause; 
- (void)setClearsBackground:(BOOL)flag; 
@end 

Au début, je pensais que la méthode setClearsBackground était étant ajouté à la définition de classe QCView. Mais quand je recherche dans ce fichier d'implémentation, je ne trouve aucune implémentation d'une méthode setClearsBackground (bien que ce message soit envoyé à une instance QCView à quelques endroits dans le fichier). Pourquoi une personne déclarerait-elle une méthode sur une classe de structure comme QCView, mais ne l'appliquerait nulle part? Ma seule supposition est que c'est un moyen de contourner le compilateur et d'appeler une méthode qui n'est pas déclarée dans le fichier QCView.h. Mais cela semble peu probable, car comment le développeur pourrait-il savoir qu'une implémentation de cette méthode existe même?

Répondre

6

Le développeur a probablement utilisé un outil tel que class-dump afin de générer des en-têtes qui répertorient toutes les méthodes implémentées par un framework. Ceci est utile si vous avez besoin d'accéder à SPI et n'avez pas d'autre choix. Sans la déclaration, Objective-C émet des hypothèses sur les paramètres de la méthode et, au-delà de la génération d'un avertissement, peut générer un appel de méthode incorrect. Toutes les mises en garde habituelles concernant une rupture d'interface non documentée dans une future révision du système d'exploitation s'appliquent. Au minimum, vous devez vérifier si l'objet répond à cette méthode (-[NSObject respondsToSelector]). Pour plus de paranoïa, vous pouvez envelopper l'invocation dans un bloc d'exception, dans le cas où la méthode est restée mais son comportement a changé.

+0

Interface de programmation du système. Essentiellement, toute fonction ou méthode (techniquement) accessible de l'extérieur qui n'est pas explicitement documentée ou prise en charge. –

+0

Réponse géniale, merci. J'ai téléchargé classe-dump et l'ai exécuté sur QuartzComposer.framework et les méthodes ci-dessus apparaissent dans la sortie, donc je pense qu'il est sûr de dire que c'est exactement ce que l'auteur faisait. Merci encore. – erikprice

Questions connexes