Frage

Ich erstelle eine Cocoa-Anwendung und verwende Xcode für verschiedene Codegenerierungen.Funktioniert gut zum Generieren von .h- und .m-Dateien für die Unterklassifizierung von UIView, aber wenn ich UIViewController in eine Unterklasse umwandele, erhalte ich eine @interface Deklaration in beiden Dateien identisch, außer dass sie in der .m-Datei vorhanden ist ( ) Am Ende:

//in MyViewController.h
@interface MyViewController : NSViewController <MyViewDelegate>

@end

aber auch

//in MyViewController.m
@interface MyViewController ()

@end

@implementation MyViewController

@end

Dennoch lässt es sich gut kompilieren.Unter der Annahme, dass dies ein normales Verhalten ist, besteht die Frage aus zwei Teilen:(A) Warum geschieht das und (b) was sind die Ergebnisse - insbesondere in Bezug auf die Kompilierungsreihenfolge?

Danke!

War es hilfreich?

Lösung

Wenn ich UIViewController in eine Unterklasse umwandele, erhalte ich eine @interface-Deklaration, die in beiden Dateien identisch ist, außer dass sie in der .m-Datei () hat.

Wie Sie bemerkt haben, sind die beiden Schnittstellenblöcke nicht identisch – die () ist wichtig.Der mit dem () ist ein Klassenerweiterung, was einer Kategorie ohne Namen ähnelt.Die zwei wichtigen Unterschiede zwischen einer Kategorie und einer Klassenerweiterung sind:

  1. Sie können Instanzvariablen in einer Klassenerweiterung deklarieren, nicht jedoch in einer Kategorie.

  2. Eine Klassenerweiterung muss in derselben Datei wie der Implementierungsblock erscheinen.

Klassenerweiterungen sind nützlich zum Deklarieren von Instanzvariablen und -methoden, die Sie nicht in der Header-Datei verfügbar machen möchten, z. B. Methoden oder Variablen, die spezifisch für die Implementierung sind und auf die sich Benutzer der Klasse nicht verlassen sollten.

Andere Tipps

Bist du mit Kategorien vertraut?Was Sie beobachten, ist ähnlich, hat jedoch wichtige Unterschiede von Kategorien.Der Unterschied hier ist, dass es anonym ist (daher die leeren Parens) und gleichzeitig zusammengestellt und die Originalklasse kompiliert ist.Dieser spätere Teil ist ein wichtiger Teil: Es bedeutet, dass Sie Instanzeigenschaften (Speicher) hinzufügen können.Dies wird am häufigsten verwendet, um "interne nur" oder "private" -Methoden und Eigenschaften zu deklarieren.Beachten Sie jedoch, dass es zur Laufzeit keine Vorstellung von "privaten" Durchsetzung gibt, es geht darum, welche Schnittstelle Sie vs. nicht veröffentlicht haben.Dies ist nur eine Möglichkeit, eine sehr klar definierte Benutzeroberfläche zu haben, die nur "veröffentlicht" ist, die die Implementierungsdatei der Kernklasse autorisieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top