2016-07-23 13 views
0

HINWEIS: Ich spreche nur über .m Datei hier.Instanzvariablen nur intern in Klasse sichtbar

ich durch diese beiden Dinge bin verwirrt, beide sollen die Art und Weise sein, interne Instanzvariable zu deklarieren:

Way 1:

@interface MyClass() 
// Declare instance variable which is only visible in this class 
@end 

@implementation MyClass 
... 
@end 

Way 2:

@implementation MyClass { 
    // Declare instance variable which is only visible in this class 
} 
... 
@end 

Was sind die Unterschiede zwischen diesen beiden Arten der Deklaration von Instanzvariablen?

Antwort

0

In Bezug auf die Funktionalität gibt es keinen Unterschied.

Wenn Sie die Ivars in einer Klassenerweiterung deklarieren - das Muster @interface MyClass() {...ivars...}@end - können Sie die Ivar-Deklaration in eine Header-Datei verschieben, die dann von anderen Klassen für direkten Zugriff beispielsweise nur für interne Zwecke verwendet werden kann.

0

Nach der Zeile "@interface" können Sie Instanzvariablen in geschweiften Klammern hinzufügen. Das sind Instanzvariablen, keine Eigenschaften. Nach den geschweiften Klammern oder direkt nach der Zeile "@interface", wenn Sie keine geschweiften Klammern haben, fügen Sie Methoden und Eigenschaften hinzu.

Also Ihr erster Kommentar ist falsch. Instanzvariablen können nur innerhalb der geschweiften Klammern hinzugefügt werden. Eigenschaften generieren Instanzvariablen (normalerweise, aber nicht immer), aber sie sind keine Instanzvariablen.

0

Neben Ivar, Eigenschaften erzeugen auch Setter und Getter-Methode, falls erforderlich (entsprechend Ihrer Eigenschaft Attribut). Wenn Sie jedoch Setter und Getter synchron implementieren, würde der Compiler ivar nicht synthetisieren, da der Compiler davon ausgeht, dass Sie die Kontrolle über die Eigenschaftsimplementierung übernehmen und eine Instanzvariable nicht automatisch synthetisiert.

0

In Objective C der { } ist es der Bereich, in dem Sie Instanzvariablen deklarieren. Sie können auch die Deklaration des Zugriffsmembers in diesem Abschnitt verwenden, z. B. @private @public & @protected. Wenn Sie die "ivars" außerhalb der {} deklarieren, wird die Variable eine Dateibereichsvariable (Art von statisch) sein und es wird keine Instanzvariable Ihrer Klasse sein.

Wenn Sie Eigenschaften verwenden() ist der Compiler intelligent genug und wird seine eigenen Ivars mit seiner entsprechenden Setter und Getter erstellen.

Mithilfe einer Klassenerweiterung in der Implementierungsdatei können Sie Ivars oder Eigenschaften (und Methoden) hinzufügen, auf die nur die Implementierung der Klassenerweiterung zugreifen kann. Außerdem können Sie den Zugriff von Basisklassen wie Eigenschaften oder privaten Methoden überschreiben.

Verwandte Themen