Question

J'ai téléchargé un exemple de code de graphique AA-terrain.

L'un des fichiers .h:

@interface MainViewController : UIViewController <APYahooDataPullerDelegate, CPPlotDataSource> {
    CPLayerHostingView *layerHost;
@private
    APYahooDataPuller *datapuller;
    CPXYGraph *graph;
}    
@property (nonatomic, retain) IBOutlet CPLayerHostingView *layerHost;
@end

Dans le fichier .m l'interface est déclarée à nouveau?

@interface MainViewController()

@property(nonatomic, retain) CPXYGraph *graph;
@property(nonatomic, retain) APYahooDataPuller *datapuller;

@end

J'ai trouvé le code ci-dessus dans le principal code du contrôleur de vue de l'exemple de projet.

Si je fais ce qui suit, quelle sera la différence entre le code ci-dessus et le code ci-dessous

@interface MainViewController : UIViewController <APYahooDataPullerDelegate, CPPlotDataSource> {
    CPLayerHostingView *layerHost;
    APYahooDataPuller *datapuller;
    CPXYGraph *graph;
}    
@property (nonatomic, retain) IBOutlet CPLayerHostingView *layerHost;
@property(nonatomic, retain) CPXYGraph *graph;
@property(nonatomic, retain) APYahooDataPuller *datapuller;
@end
Était-ce utile?

La solution

Les choses que vous voyez « supplémentaire » dans le fichier .m est une . Le programmeur d'origine probablement voulait juste cacher certains de ses détails d'implémentation de l'interface publique de sa classe (dans le fichier .h), alors il a fait une catégorie (sans nom dans ce cas, ce qui est la raison pour laquelle il n'y a rien à l'intérieur du ()) pour ajouter eux dans son dossier de mise en œuvre. Dans ce cas précis, il se cache les accesseurs pour ses variables privées afin que le code externe ne peut pas les atteindre.

Les modifications que vous accordez à votre deuxième extrait de code mis tout en une seule interface de classe. Ces changements ne devraient pas affecter le fonctionnement de l'exécution du tout. (Sauf que vous avez pris le @private, était fait exprès?) La différence sémantique est que les méthodes de catégorie sont ajoutés à la classe lors de l'exécution.

Les catégories peuvent ajouter uniquement des méthodes, et non pas des variables d'instance, ce qui explique pourquoi le code d'origine a toutes les variables (exemple des déclarations, même celles avec les accesseurs « secrets ») dans le bloc @interface d'origine.

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