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.
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