Question

Je crée une application Cocoa et j'utilise Xcode pour diverses générations de code.Fonctionne bien pour générer des fichiers .h et .m pour sous-classer UIView, mais lorsque je sous-classe UIViewController, j'obtiens un @interface déclaration identique dans les deux fichiers, sauf que dans le fichier .m elle a ( ) à la fin:

//in MyViewController.h
@interface MyViewController : NSViewController <MyViewDelegate>

@end

mais aussi

//in MyViewController.m
@interface MyViewController ()

@end

@implementation MyViewController

@end

Et pourtant, ça compile bien.Donc, en supposant qu'il s'agisse d'un comportement normal, les deux parties de la question sont :(A) Pourquoi cela se produit-il et (b) quels sont les résultats - en particulier en termes d'ordre de compilation?

Merci!

Était-ce utile?

La solution

quand je sous-classe UIViewController, j'obtiens une déclaration @interface identique dans les deux fichiers, sauf que dans le fichier .m elle a ( )

Comme vous l'avez remarqué, les deux blocs d'interface sont pas identique -- le () est important.Celui avec le () est un extension de classe, qui est similaire à une catégorie sans nom.Les deux différences importantes entre une catégorie et une extension de classe sont :

  1. Vous pouvez déclarer des variables d’instance dans une extension de classe, mais vous ne pouvez pas le faire dans une catégorie.

  2. Une extension de classe doit apparaître dans le même fichier que le bloc d'implémentation.

Les extensions de classe sont utiles pour déclarer des variables d'instance et des méthodes que vous ne souhaitez pas exposer dans le fichier d'en-tête, telles que des méthodes ou des variables spécifiques à l'implémentation et sur lesquelles les utilisateurs de la classe ne doivent pas s'appuyer.

Autres conseils

Connaissez-vous les catégories ?Ce que vous observez est similaire, mais présente des distinctions importantes par rapport aux catégories.La distinction ici est qu'elle est anonyme (d'où les parenthèses vides) et compilée en même temps que la classe d'origine est compilée.Cette dernière partie est une partie importante :cela signifie que vous pouvez ajouter des propriétés d'instance (stockage).Ceci est le plus souvent utilisé pour déclarer des méthodes et propriétés « internes uniquement » ou « privées ».Mais gardez à l'esprit qu'au moment de l'exécution, il n'y a pas de notion d'application « privée », tout dépend de l'interface que vous avez publiée par rapport à celle que vous avez publiée.non publié.Ce n'est qu'une façon d'avoir une interface très clairement définie qui n'est « publiée » qu'aux personnes qui créent le fichier d'implémentation de la classe principale.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top