ti riferisci a questa definizione di interfaccia:
@interface MYViewController()
@end
Questo è tecnicamente un'estensione di classe piuttosto che una categoria. Le categorie hanno una stringa all'interno delle parentesi. Le estensioni di classe vengono aggiunte alla classe in fase di compilazione, e quindi possono aggiungere ivars (di solito sotto forma di proprietà). Le categorie vengono aggiunte in fase di runtime e non è possibile aggiungere ivars.
Detto questo, il punto è corretto. Questo è usato per definire metodi e proprietà private.
Nel mondo ObjC, "privato" è un cartello "no trespassing", non un muro di filo spinato. Mentre c'è una parola chiave @private
(che aggiunge l'applicazione del compilatore), si applica solo a ivars e generalmente non è necessaria. Questo tipo di privacy basata su avvisi funziona molto bene in ObjC ed è abbastanza sufficiente.
Inserisci le tue proprietà private in questa estensione di classe, e i chiamanti esterni riceveranno gli avvertimenti "potrebbe non rispondere al selettore" se tentano di accedervi (proprio come si farebbero per chiamare qualsiasi metodo non definito). Non dovresti mai permettere che gli avvertimenti esistano in un progetto ObjC, quindi questo impone l'incapsulamento dei dati.
EDIT
Se sono privati, allora non dovrebbero comparire nella sottoclasse. Quello che vuoi è protetto. Non esiste un grande schema per i metodi protetti in ObjC, ma una tecnica comune è metterli in una categoria in un file .h come MYViewController + Protected.h. Trovo che ciò avvenga molto raramente nella pratica, dal momento che gran parte del design di ObjC non è sottoclasse. Usa invece composizione e delega.
In merito a "Perché è sufficiente visualizzare i controller". Innanzitutto, non sono solo i controller di visualizzazione. Sono solo i controller di visualizzazione su iOS (beh, VC, TableViewController e GLKViewController). Su Mac, sono anche controllori di finestre e importatori di riflettori.Cerca in:
.../Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Templates
.../Library/Xcode/Templates
Ma perché quelli? Bene, quelli sono tutti controller, ed è insanamente comune che i controllori abbiano bisogno di proprietà private. In effetti, se non hai proprietà private in un controller, probabilmente stai facendo troppa pubblicità. Non è così universale per le classi di modelli e visualizzazioni. Sospetto che abbia giocato nella loro decisione. Potrebbero anche esserci persone diverse che hanno posseduto i modelli o che sono stati aggiornati in momenti diversi. A volte vedi piccole incongruenze che si attenuano nel tempo.
È possibile creare anche i propri modelli. Vedi Creating Custom Xcode 4 File Templates.
La risposta di Rob era buona, ma ... Qualcuno ha idea del motivo per cui XCode genera solo questo per sottoclassi di UIViewController e non per tutte le classi? (Potrebbe farlo per alcuni altri, ma le solite classi che espongo non mostrano questo comportamento.) – VaporwareWolf