Sto guardando l'applicazione per iPad e iPhone della Stanford University. L'istruttore dice nel video che possiamo controllare e trascinare un oggetto UI sui file di implementazione per creare un'azione. Ma in questo modo il metodo non verrà dichiarato nel file di intestazione. Significa che è corretto implementare i metodi nel file .m ma non dichiararli nel file .h?Non possiamo dichiarare metodi nei file di intestazione?
risposta
Dipende da come si definisce "ok" :-)
Objective-C utilizza metodo dinamico ricerca e non impone realmente l'accesso (specificatori "privati", "pubblici", ecc.). Quindi non è necessario dichiarare alcun metodo in un file di intestazione.
Tuttavia si finirà per combattere il compilatore in quanto fa una buona quantità di controllo dei tipi a meno che non lo si persuade a non farlo, e si perderà così facendo.
Non è necessario dichiarare nel file di intestazione tutti i metodi dell'implementazione. Ma se non ci si trova nel file di intestazione, ovviamente non si può fare riferimento ad essi con il nome letterale in un altro file, né si possono "inoltrare" nel file di implementazione.
(Si noti che questo non è molto diverso dal normale C, ma è diverso da metodi di una classe in C++.)
E ' "OK" per non dichiarare metodi nell'intestazione sì, in determinate circostanze. Ad esempio, se si utilizza ARC, in genere il compilatore deve conoscere la firma del metodo in modo che possa fare la cosa giusta. Ma fondamentalmente tutto ciò significa che ovunque tu stia utilizzando il metodo, deve già conoscere il metodo che stai chiamando.
Dato che si parla di Interface Builder, questo è leggermente diverso in quanto saprà di tutti i metodi poiché può "vedere" l'intero contesto dei file di intestazione e implementazione e sapere che esiste un metodo. nella mia terminologia precedente, il metodo è stato definito prima di essere utilizzato.
Per quanto riguarda la definizione di prima dell'uso, l'approccio generale è accettato, a:
definire un metodo nel file di interfaccia (h). es .:
MyClass.h
@interface MyClass : NSObject - (void)someMethod; @end
MyClass.m
@implementation MyClass - (void)someMethod { // do something } @end
Definire un metodo in una categoria classe continuazione. ad esempio:
MyClass.h
@interface MyClass : NSObject @end
MyClass.m
@interface MyClass() - (void)someMethod; @end @implementation MyClass - (void)someMethod { // do something } @end
- 1. Dichiarare classe Qt nel file di intestazione
- 2. Definizione di variabile nei file di intestazione
- 3. Intestazioni precompilate nei file di intestazione
- 4. Maiuscole/minuscole nei file di intestazione C++
- 5. C: Qual è l'uso di "extern" nei file di intestazione?
- 6. dichiarare e inizializzare costante nel file di intestazione
- 7. Possiamo dichiarare la variabile globale nel file QML?
- 8. Possiamo dichiarare una funzione amico senza argomento?
- 9. Perché non possiamo dichiarare uno std :: vector <AbstractClass>?
- 10. Metodi statici nei moduli rubino?
- 11. Gestione automatica intestazione licenza/autore/versione nei file di origine
- 12. Come possiamo testare i metodi del controller angolare non-scope?
- 13. Perché Dichiarare una categoria nella stesso file di intestazione come dichiarazione Classe
- 14. Perché non ci sono classi nei metodi in Ruby?
- 15. PhpStorm - stampa metodi e variabili nei file di classe
- 16. Lettura dei dati di intestazione nei binari
- 17. C#: Perché non possiamo avere metodi interni/funzioni locali?
- 18. Xcode non trova il file di intestazione
- 19. Cocoapods 1.0: file di intestazione non trovati
- 20. L'alias dei nomi dei nomi C++ dovrebbe essere usato nei file di intestazione?
- 21. YouCompleteMe, file di intestazione
- 22. Perché dobbiamo dichiarare metodi virtuali come tali
- 23. <string> nel file di intestazione
- 24. Come si ordinano automaticamente i metodi per intestazione?
- 25. Posso dichiarare una stringa in un file di intestazione in una definizione di una classe?
- 26. Perché non possiamo dichiarare alias di spazi dei nomi all'interno di una classe?
- 27. System.out.print() non mostra nulla nei metodi di prova
- 28. Due modi per dichiarare metodi in Javascript
- 29. Perché utilizziamo "questo" nei metodi di estensione?
- 30. Non utilizzare i metodi di accesso nei metodi di inizializzazione e dealloc
Sembra che il comportamento del compilatore sia stato leggermente modificato in Xcode 4.5. Ho un sacco di metodi che non ho dichiarato in .h e non ottengo errori del compilatore. Tuttavia, quando prendo questo codice in Xcode 4.2 in modo da poter verificare la compatibilità con iOS 4.3 il compilatore genera errori. – JScarry
@JScarry - Ho notato un comportamento simile, anche se sembra variare con una sorta di flag del compilatore. Ma Xcode 4.5 sta spingendo l'uso di una versione '()' dell'interfaccia '@' nella .m, e puoi incollare lì tutte le dichiarazioni interne. –