2013-04-07 7 views

risposta

7

Ha a che fare con la visibilità dei contenuti di @interface. Quando è contenuto nel file di intestazione, è disponibile per altre classi da vedere quando importano il file di intestazione. Quando è contenuto nel file di implementazione, i contenuti sono disponibili solo per quel file di implementazione. In genere, quando viene dichiarato all'interno del file di implementazione, viene eseguito tramite un'estensione di classe (ad esempio @interface ClassName(), lo () denota un'estensione di classe/categoria anonima), sebbene sia possibile utilizzare una categoria denominata, se lo si desidera.

Ci sono alcuni motivi per cui questo è stato fatto. Il principale è definire variabili o proprietà di istanze private. Non vuoi che siano esposti a tutti coloro che importano il file di intestazione, ma hai bisogno di un posto dove archiviare le informazioni interne. Ad esempio, questo permetterà m_isActive da utilizzare all'interno solo l'attuazione:

@interface Class() { 
    BOOL m_isActive; 
} 

È inoltre possibile ignorare le proprietà di sola lettura dichiarate nel file di intestazione, in modo che il file di implementazione ha readwrite accesso ad essa quando si utilizza la notazione punto. Per esempio:

Intestazione:

@interface Class 
@property (nonatomic, readonly) NSString* name; 
@end 

Implementazione:

@interface Class() 
@property (nonatomic) NSString* name; 
@end 

@implementation Class 
... 
    self.name = @"WDUK"; // This is allowed, as the class extension has overridden the readonly attribute via a redeclaration of the property 
... 
@end 

Un altro uso popolare è quello di dichiarare in privato che si conformi a particolari protocolli, che è un dettaglio di implementazione e non ha bisogno di essere esposto all'interno del file di intestazione pubblico. Ad esempio, quando l'implementazione utilizza un oggetto che richiede che sia un delegato e non si desidera inquinare il file di intestazione con un protocollo che non viene utilizzato al di fuori della classe.

Altri usi (che sono stati lasciati al buio con i recenti miglioramenti di LLVM/Clang) dovevano definire metodi privati. Questo non è più necessario, poiché il compilatore cercherà i metodi non dichiarati all'interno del rispettivo file di intestazione e assumerà che siano privati ​​della classe e li dichiarino da soli.

La parte fondamentale di prendere da tutto questo, è che qualsiasi cosa all'interno @interface all'interno del file di intestazione (tranne le variabili d'istanza definite c'è via @private o @protected) sono pubbliche, e qualsiasi cosa all'interno del file di implementazione è intrinsecamente privata.

+1

Un altro utilizzo dell'estensione di classe consiste nel dichiarare privatamente che la classe è conforme a uno o più protocolli. – rmaddy

+0

Picchiami al punch, lo aggiungevo già! Ottimo punto però. – WDUK

+0

Quali sono questi protocolli di cui voi ragazzi state parlando? –

2

Quello nel file di intestazione definisce l'interfaccia pubblica.

Quello nel file di implementazione è un'estensione di classe che estende l'interfaccia pubblica a qualsiasi dettaglio di implementazione privato.

Problemi correlati