2010-10-19 5 views
72

Normalerweise benutzen wirUnterschied zwischen @interface Definition in .h und .m-Datei

@interface interface_name : parent_class <delegates> 
{ 
...... 
} 
@end 

Methode in .h-Datei und in .m-Datei-Synthese wir die Eigenschaften von Variablen in .h-Datei deklariert.

Aber in einigen Code, diese @ Schnittstelle ..... @ End-Methode wird auch in der .m-Datei gehalten. Was heißt das? Was ist der Unterschied zwischen ihnen?

auch einige Worte über Getter und Setter für die Schnittstellendatei geben, die in .m-Datei ...

Vielen Dank im Voraus definiert ist

Antwort

58

Es ist üblich, ein zusätzliches @interface zu setzen zu setzen, die, die eine Kategorie definiert private Methoden:

Person.h:

@interface Person 
{ 
    NSString *_name; 
} 

@property(readwrite, copy) NSString *name; 
-(NSString*)makeSmallTalkWith:(Person*)person; 
@end 

Person.m:

Die 'private category' (der Eigenname für eine namenlose Kategorie ist nicht 'private category', es ist 'class extension') .m verhindert, dass der Compiler vor der Definition der Methoden warnt. Da es sich bei @interface in der .m-Datei jedoch um eine Kategorie handelt, können Sie keine Ivars darin definieren.

6. Update-Aug '12: Objective-C entwickelt hat, da diese Antwort geschrieben wurde:

  • ivars kann in einer Klasse Erweiterung deklariert werden (und immer sein könnte - die Antwort war falsch)
  • @synthesize nicht
  • erforderlich
  • ivars kann nun in Klammern an der Spitze der @implementation deklariert werden:

t Hut ist,

@implementation { 
    id _ivarInImplmentation; 
} 
//methods 
@end 
+4

Kleine Bemerkung am Rande, nicht tatsächlich etwas in den Klammern setzen, wenn Sie die private Schnittstelle deklarieren. Andernfalls wird nur eine Kategorie erstellt, und Sie möchten das nicht. '@interface Person()' wird ausreichen. –

+0

Danke itaiferber, das hatte ich nicht bemerkt. Ich habe meine Antwort aktualisiert. –

+4

Wenn Leute interessiert sind, mehr über Kategorien zu erfahren .. diese [Seite] (http://macdevelopertips.com/objective-c/objective-c-categories.html) war sehr nützlich für mich. – Tim

0

Sie können auch andere Klassen in .m-Datei erstellen, zum Beispiel andere kleine Klassen, die von der Klasse erben in .h-Datei deklariert, aber einige leichte unterschiedliches Verhalten aufweisen. Sie könnten dies in einer Fabrik Muster verwenden

3

Das Konzept ist, dass Sie Ihr Projekt viel sauberer machen kann, wenn man die .h an die öffentlichen Schnittstellen der Klasse beschränken , und setzen dann privaten Implementierungsdetails in diesem Klassenerweiterung.

wenn Sie variable Methoden oder Eigenschaften in ABC.h Datei deklarieren, es bedeutet, dass diese Variablen Eigenschaften und Methoden Zugang außerhalb der Klasse sein kann

@interface Jain:NSObject 
{ 
    NSString *_name; 
} 

@property(readwrite, copy) NSString *name; 
-(NSString*)makeSmallTalkWith:(Person*)jain; 
@end 

@interface Sie private ivars, Eigenschaften zu erklären erlaubt und Methoden. Alles, was Sie hier deklarieren, kann nicht von außen auf diese Klasse zugegriffen werden .Im Allgemeinen sollten Sie alle ivars, Eigenschaften und Methoden standardmäßig als privat

einfach erklären wollen sagen, wenn Sie Variable Methoden oder Eigenschaften in ABC.m Datei deklarieren, bedeutet es, diese Variablen Eigenschaften und Methoden können nicht Zugang sein außerhalb der Klasse

@interface Jain() 
    { 
     NSString *_name; 
    } 

    @property(readwrite, copy) NSString *name; 
    -(NSString*)makeSmallTalkWith:(Person*)jain; 
    @end 
Verwandte Themen