2012-07-21 12 views
29

Mi chiedo perché ci sia il doppio @interface. Uno su class.h e altro su class.m. Per esempio:Perché c'è @interface sopra @implementation?

TestTableViewController.h:

#import <UIKit/UIKit.h> 

@interface TestTableViewController : UITableViewController 

@end 

e (generata automaticamente) class.m trovo:

#import "TestTableViewController.h" 

@interface TestTableViewController() 

@end 

@implementation TestTableViewController 

... methods delegated from UITable delegates 

@end 

Quindi la mia domanda è, ciò che il @interface TestTableViewController() nel file .m è circa. Perché è lì? Ne ho bisogno?

Grazie in anticipo

+0

possibile duplicato di [Differenza tra la definizione di \ @interface nel file .h e .m] (http://stackoverflow.com/questions/3967187/difference-between-interface-definition-in-h-and-m- file), [qual è la dichiarazione \ @interface nei file .m utilizzati nei progetti iOS 5?] (http://stackoverflow.com/questions/9751057/what-is-the-interface-declaration-in-m- files-used-for-in-ios-5-projects), [Due interfacce nei file * .h e * .m] (http://stackoverflow.com/questions/9590917) [Dichiarare l'interfaccia all'interno del file di implementazione (Obiettivo- C)] (http://stackoverflow.com/questions/10647913/) –

risposta

46

La seconda direttiva @interface è nel file di implementazione (.m) - è possibile dedurre che è destinata alla dichiarazione di cose che il cretator della classe non ha voluto esporre all'utente della classe. Questo di solito significa metodi e proprietà privati ​​e/o interni. Si noti inoltre che ci sono due tipi di fare questo. L'unica (che vedete qui) è chiamata una "classe estensione" ed è indicata da una coppia vuota di parentesi:

@interface MyClass() 

Questo è particularily importante perché è possibile utilizzare questo per aggiungere le variabili di istanza aggiuntive per la classe .

Il secondo, chiamato "categoria", è indicato da una coppia di parentesi non vuota, che racchiude il nome della categoria, come questo:

@interface MyClass (CategoryName) 

ed è anche utilizzato per estendere la classe .Non è possibile aggiungere variabili di istanza a una classe utilizzando le categorie, ma è possibile avere più categorie per la stessa classe, motivo per cui è principalmente utilizzato per estendere le classi di sistema/framework per le quali non si ha il codice sorgente - quindi una categoria, in questo senso, è l'esatto contrario dell'estensione di classe.

2

Lì è possibile dichiarare i metodi privati ​​e le proprietà che si desidera utilizzare solo in classe, ma non esporre ad altre classi.

3

La seconda "interfaccia" definisce un'estensione per la classe "TestTableViewController", che non è visibile a qualcuno che importa solo il file h. Questo è il modo de facto per creare metodi privati ​​nell'obiettivo C.

+0

No, non è una categoria, è un'estensione di classe. -1. –

+1

Non molto bello con il -1. La differenza tra le categorie e le estensioni è prevalentemente semantica: un'estensione è fondamentalmente una categoria anonima, che richiede di essere implementata nel blocco di implementazione principale della classe. Pertanto, l'impostazione di un nome tra parentesi del secondo blocco "interfaccia" creerà effettivamente una categoria e non un'estensione ... – dcoder

2

L'interfaccia nel file TestTableViewController.h è la dichiarazione di un'estensione di classe. Ci sono 2 parentesi tonde che mostrano questo. La sintassi è la stessa della scrittura di una categoria per una classe. Ma in questo caso è utilizzato per dichiarare una sorta di metodi privati ​​l'autore non vuole esporre nel file di intestazione

Un normale interfaccia categoria si presenta così:

@interface TestTableViewController (Your_Category_Name) 
- (void)doSomething; 
@end 

e la corrispondente realizzazione:

Nell'esempio non è stato specificato il nome della categoria, quindi estende semplicemente la classe e è possibile implementare il metodo nella normale implementazione.

Normalmente questa tecnica viene utilizzata per "nascondere" i metodi. Non sono dichiarati nel file di intestazione e non sono visibili se si importa solo il file .h.

+0

Utilizza categorie utili a scopi diversi dalla dichiarazione di metodi privati ​​e categorizzazione del codice? –

+0

Grazie per avermelo detto. Non l'avevo ora chiamata estensione di classe. Ho pensato a questo come una categoria fino ad ora. Io lo aggiusterò. –

+0

Anche se non c'è un nome, non si sta ancora estendendo la classe? Come possiamo quindi aggiungere variabili di istanza? – Honey

Problemi correlati