2012-01-12 16 views
6

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

6

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.

5

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++.)

+0

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

+0

@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. –

5

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:

  1. 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 
    
  2. 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 
    
Problemi correlati