2013-03-04 3 views
5

Was ist die Konvention/Regel/Präferenz/Diktat über wo private Instanzvariablen deklariert werden sollten und warum?Wo verstecken sich Ihre Privates in Objective-C

// someClass.h 

@interface someClass : NSObject { 
@private 
// Here in the class declaration? 
} 
// ... 
@end 

// someClass.m 

@interface someClass() { 
// Here in the class extension? This seems to be obj-c's version 
// of the C++ Pimpl idiom. 
} 
@end 

@implementation someClass { 
// Here in the class definition? BTW, what's the default scope here? 
// Seems like it should be @private. I haven't been able to find much 
// documentation about this declaration block. 
} 
// ... 
@end 

Kann jemand die entsprechende Verwendung dieser drei Abschnitte kommentieren oder auf eine gute Webressource verweisen? Vielen Dank!

+6

+1 für den Titel. – IronMan84

+0

Der Titel ist ein bisschen frech, aber ich bin ernst mit der Frage. Ich konnte keine gründliche Dokumentation zu diesem Thema finden. Nichts, was ich aus Büchern (Kochan, Sadun, Ali) und Apple Doc gesehen habe, gibt eine gründliche und umfassende Diskussion darüber. – Phil

+2

Der Standardbereich von Ivars im Block '@ implementation' ist' @ private'. Dies ist jedoch mit ziemlicher Sicherheit irrelevant, denn wenn Sie nicht mehrere Klassen in dieselbe '.m'-Datei schreiben, können keine anderen Klassen * die * Ivars * sehen, was eine Voraussetzung für den Zugriff ist. –

Antwort

4

Heute ist es das beste Verfahren, sie in die @implementation oder in einer (nicht öffentlichen) Klassenerweiterung zu setzen.

Ivars sind für Clients einer Klasse nie von Interesse, daher sollten sie in der öffentlichen API (Header) nicht sichtbar sein.

Es gibt keinen großen Unterschied, sie in die @ Implementierung oder in eine Klassenerweiterung zu setzen. Für die Konsistenz lege ich sie immer in die Implementierung.

+0

für Konsistenz habe ich sie immer in eine Klassenerweiterung gesteckt. – vikingosegundo

+0

Eine weitere Frage, wenn ich darf: Was würden Sie befürworten für Klassen, die Instanzvariablen gegenüber Unterklassen offen legen wollen? Persönlich tendiere ich dazu, eine Kategorie mit geeigneten Gettern vorzuziehen und möglicherweise anderswo als im Haupttext 'public' zu deklarieren. – Tommy

+0

@Tommy Ich halte dies für die Kapselung brechen. Andere Klassen (Unterklasse oder nicht) sollten nie auf Ivars zugreifen. –