2012-07-27 6 views
6

ich diese während bemerkt iOS6 Beta mit 3Xcode generiert jetzt eine leere Kategorie. Warum?

Wenn ich eine neue Unterklasse einer UIViewContoller (keine anderen Elternklassen dieses Verhalten erzeugen, die ich bemerkt habe) erstellen, hat die .m-Datei nun eine leere Kategorie an der Spitze der Datei. In der Vergangenheit, als ich über Kategorien lernte, bemerkte ich, dass einige Leute dieselbe Technik verwenden würden, um private Methoden anzuzeigen (obwohl sie nicht wirklich privat waren).

Ist das die Absicht hier? Hat sich etwas daran geändert, Dinge jetzt wirklich privat zu machen? Ich bemerke die @private-Direktive auch dort.

Was ist Ihre Person Codierung Stil in Bezug auf private vars und Methoden?

UPDATE: Da XCode uns dazu treibt, die Klassenerweiterungen zu verwenden, ging ich weiter und nutzte sie für private Methoden/ivar für dieses Projekt. Ich habe jedoch einen Nachteil festgestellt. Ich sah, dass ich einen meiner Unterklasse UIViewControllers zusammen mit all seinen UIButtons, UILabels usw. verwenden konnte. Ich hatte diese Vererbung: UIViewController < - FirstViewController < - SecondViewController.

Nun, alle privaten Methoden, die ich in der Klassenerweiterung von FirstViewController einfügen, erscheinen nicht in der Autovervollständigung, wenn ich in SecondViewController einprogrammiere. Ein leichter Ärger ....

+0

Robs Antwort war gut, aber ... Hat jemand eine Idee, warum XCode nur für Unterklassen von UIViewController und nicht alle Klassen generiert? (Es kann für einige andere tun, aber die üblichen Klassen, die ich erweitere, zeigen dieses Verhalten nicht an.) – VaporwareWolf

Antwort

19

Sie beziehen sich auf diese Schnittstellendefinition:

@interface MYViewController() 
@end 

Dies ist technisch eine Klasse Erweiterung eher als eine Kategorie. Kategorien haben eine Zeichenfolge innerhalb der Klammern. Klassenerweiterungen werden der Klasse zur Kompilierzeit hinzugefügt und können daher auch Ivars hinzufügen (normalerweise in Form von Eigenschaften). Kategorien werden zur Laufzeit hinzugefügt und können keine Ivars hinzufügen.

Alles, was gesagt wurde, ist Ihr Punkt richtig. Dies wird verwendet, um private Methoden und Eigenschaften zu definieren.

In der ObjC-Welt ist "privat" ein "kein Hausfriedensbruch" -Schild, keine Drahtseilwand. Es gibt zwar ein Schlüsselwort @private (das die Compiler-Durchsetzung hinzufügt), es gilt jedoch nur für Ivars und ist im Allgemeinen nicht erforderlich. Diese Art von warnbasierter Privatsphäre funktioniert sehr gut in ObjC und ist völlig ausreichend.

Versetzen Sie Ihre privaten Eigenschaften in diese Klassenerweiterung, und externe Anrufer erhalten Warnungen "nicht auf Selektor reagieren", wenn sie versuchen, auf sie zuzugreifen (genau wie beim Aufruf einer undefinierten Methode). Sie sollten niemals zulassen, dass Warnungen in einem ObjC-Projekt vorhanden sind, sodass die Datenkapselung erzwungen wird.


EDIT

Wenn sie privat sind, dann knallen sie sollten nicht in der Unterklasse auf. Was Sie wollen, ist geschützt. Es gibt kein tolles Schema für geschützte Methoden in ObjC, aber eine gängige Technik besteht darin, sie in eine Kategorie in einer .h-Datei wie MYViewController + Protected.h einzufügen. Ich finde, das kommt in der Praxis sehr selten vor, da so viel gutes ObjC-Design keine Unterklasse ist. Stattdessen werden Komposition und Delegierung verwendet.

In Bezug auf "Warum nur Controller anzeigen." Erstens sind es nicht nur View-Controller. Es ist nur View-Controller auf iOS (naja, VC, TableViewController und GLKViewController). Auf dem Mac sind es auch Fenstercontroller und Spotlight-Importer.Schau in:

.../Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Templates 
.../Library/Xcode/Templates 

Aber warum diese? Nun, das sind alles Controller, und es ist wahnsinnig häufig, dass Controller private Eigenschaften benötigen. In der Tat, wenn Sie keine privaten Eigenschaften in einem Controller haben, machen Sie wahrscheinlich zu viel Öffentlichkeit. Das ist nicht so universell für Modell- und Sichtklassen. Ich vermute, das spielte in ihre Entscheidung mit ein. Möglicherweise waren es auch verschiedene Personen, denen die Vorlagen gehörten oder die zu unterschiedlichen Zeiten aktualisiert wurden. Manchmal sehen Sie kleine Unstimmigkeiten, die im Laufe der Zeit ausgeglichen werden.

Sie können auch Ihre eigenen Vorlagen erstellen. Siehe Creating Custom Xcode 4 File Templates.

+0

Perfekte Antwort. Vielen Dank! – VaporwareWolf

+0

@HCHogan Wenn dies Ihre Frage beantwortet hat, markieren Sie diese als Antwort (Häkchen links neben dem Beitrag). Vielen Dank. – Stunner