2013-03-02 4 views
5

In den meisten Projekten vor Xcode 4.4 stellte ich fest, dass Entwickler gleichzeitig einen Ivar und eine Eigenschaft mit demselben Namen deklarierten. BeispielWarum ist es notwendig, ivar und property mit demselben Namen zu deklarieren?

@interface SecondViewController : UIViewController 
{ 
    NSString *string; 
} 

@property (strong, retain) NSString *string; 

Also ich weiß nicht warum?

+1

dup: http://stackoverflow.com/questions/5555736/objective-c-why-do-we-declare-ivars-in-the-h-member-area- if-property-scheint-zu – justin

Antwort

1

Ich kann nicht für andere sprechen, aber ich benutze nicht den gleichen Namen. Wenn ich eine Instanzvariable deklariere, dann mit einem führenden Unterstrich, so ist es offensichtlich, wenn ich mich auf die Instanzvariable oder die Setter/Getter-Methode beziehe.

Mit Xcode 4.4+ müssen Sie die Instanzvariable nicht deklarieren oder @synthesize aufrufen, und der Compiler wird automatisch eine Instanzvariable mit einem führenden Unterstrich erstellen und die Setter/Getter-Methode für Sie bereitstellen.

Allerdings glaube ich nicht, dass dieser Mechanismus eine sehr gute Idee ist, da es Entwickler ermutigt, Eigenschaften ihrer Klasse zu exponieren, die nicht exponiert werden sollten.

Zum Beispiel dieser genommen wird von Ab iOS 6 Entwicklung:

@interface BIDViewController : UIViewController 
@property (weak, nonatomic) IBOutlet UIButton *button; 
- (IBAction)buttonPressed:(UIButton *)sender; 
@end 

Jetzt, während ich verstehe, dass Sie nicht auf einmal einen Anfänger zu viele Konzepte verwirren wollen, müssen Sie sofort verletzt die objektorientierte Kapselung, indem das Objekt UIButton und die Aktionsmethode den Benutzern dieses Ansichtscontrollers zugänglich gemacht werden, und keines davon sollte offengelegt werden.

Was passiert zum Beispiel, wenn eine mit Klasse tut dies:

BIDViewController *vc = ...; 
vc.button = nil; 

oder

vc.buttonPressed(mySegmentedControl); 

bricht die Hölle los. Jetzt, wo es 1000 Möglichkeiten gibt, ein Programm zu brechen, und wir uns nicht gegen alle verteidigen können, wollen wir kein bereits schwaches System schaffen (Objective-C liefert sehr wenig, um zu definieren, wer einen nennen kann und was nicht Ihrer Methoden) schwächer. mit privaten Instanzvariablen und Methoden

Die obige Umsetzung ist besser daran getan, die beide vom Interface Builder geehrt werden:

@implementation BIDViewController() 
{ 
    IBOutlet UIButton *_button; 
} 
- (IBAction)_buttonPressed:(UIButton *)sender; 

@end 

und alle mit Klassen werden eine härtere Zeit dieses Modell haben zu brechen.

Aber das ist natürlich mehr Denken und Tippen für einen Entwickler, und so haben Apple die neuen Funktionen eingeführt, damit sie das, was sie wollen, in kürzerer Zeit erledigen können Header-Datei und das Deklarations- und Implementierungsskelett wird für Sie bereitgestellt).

+0

"also ist es offensichtlich, wenn ich auf die Instanzvariable oder die Setter/Getter-Methode verweise" - es ist sowieso offensichtlich: 'self.foo' ist eine Eigenschaft,' foo' ist ein ivar. –

+0

@ H2CO3 Es ist ein einfacher Fehler, das 'self.'bit zu verpassen ... – trojanfoe

+0

Wie Sie in diesem Beitrag sehen können: http://inessential.com/2010/06/28/how_i_manage_memory Der Autor verwenden einen ivar und eine Eigenschaft mit dem gleichen Namen. Und ich verstehe seine Absicht nicht. – Proton

7

Nur eine Frage des Stils und des Verhaltens von früheren Compilern.

Jetzt im neueren Compiler ist dies nicht erforderlich. Sobald Sie eine Eigenschaft erstellen, wird hinter der Szene ein Ivar erstellt und synthetisiert.

Compiler synthetisiert mit einem Alias ​​als _propertyName, auch wenn Sie dieses Standardverhalten ändern können.

@interface AppDelegate : NSObject <NSApplicationDelegate>{ 
    NSString *bigString; 
} 
@property(strong)NSString *smallString; 
@end 

@implementation AppDelegate 
@synthesize smallString=bigString; 
-(void)awakeFromNib{ 
    [email protected]"hello"; 
    NSLog(@"%@",self.smallString); 
} 

@end 
+0

Dies ist die richtige Antwort, +1. Es handelt sich nicht um eine Xcode-Version, sondern um eine Sprachversion, die in einer bestimmten Version des Compilers implementiert ist. –

+0

@ H2CO3: Danke, Und wann immer du mir +1 gibst, fühle ich mich gut :) –

+0

Welche Bedeutung dieser Zeile '@synthesize smallString = bigString;' – Proton

Verwandte Themen