2009-07-31 1 views
5

ich von Ruby nach Objective-C kommen und ich immer tun:Wie kann ich DRY bringen (nicht selbst wiederholen) zu Objective-C

NSObject *foo; 

@property (nonatomic,retain) NSObject *foo; 

in der H-Datei, und dann in .m-Datei:

@synthesize foo; 

an der Spitze und

[foo release] 

in dealloc.

Es sind 4 Schritte zum Hinzufügen foo! Führen erfahrene Objective-C-Programmierer alle vier Schritte manuell jedes Mal durch, wenn sie einer Klasse eine neue Instanzvariable hinzufügen möchten? Fehle ich eine Möglichkeit, dieses TROCKEN zu machen?

+0

Dank ARC und automatische Eigenschaften zu bringen, können Sie jetzt auch diejenigen loswerden! Und der Rest ist nicht wirklich un-TROCKEN, es ist nur hässlich, wie so viel von Objective-C. –

Antwort

6

Dies ist ein gemeinsames Problem in C++ (Verdoppelung der Deklarationen, obwohl es zugegebenermaßen ein wenig anders ist). Die kurze Antwort ist, dass so die Sprache konstruiert wird. Es ist nicht wirklich gegen DRY, da jede Aussage einzigartig ist und ihren eigenen Zweck hat. Allerdings ist es nach heutigen Maßstäben zugegebenermaßen sehr ausführlich.

+1

Sei nur froh, dass du keine Getter und Setter schreibst ... Denke daran, dass es _more_ DRY ist als die Alternativen! –

+2

Wie bei allen Sprachen sind einige Dinge in objective-c eine Freude, während andere Dinge eine lästige Pflicht sind. –

+0

@ben eigentlich, wenn Sie gut codieren, haben Sie keine Setter, Getters oder Eigenschaften - aber die meisten Leute programmieren nicht sehr gut (ich sollte sagen, Sie haben keine Setter und Sie haben relativ wenige Getter) –

0

Objective-C ist eine sehr dünne Schicht über C. Auf einer niedrigen Ebene kompiliert der Großteil des "Objective" -Stücks zu Codezeigern, die in den C-Kompilierungsprozess injiziert werden.

Sie haben Referenzzählen (das grundlegendste Garbage-Collection-System) hinzugefügt, aber wegen seiner Natur wird alles von Hand erledigt, daher die "Release" -Rufe.

Die Nicht-iPhone-Versionen haben ein echtes Garbage-Collection-System hinzugefügt, aber diese werden auch nicht verkleinert, da die Freigabe nicht so deterministisch ist.

Halten Sie Ihre Objekte klein und fokussiert und die Eigenschaft Syntax sollte nicht sehr invasiv sein.

0

Ja, ich tue, aber ich hoffe täglich jemand wird mit einem Skript oder etwas für XCode kommen, um das Ding zu automatisieren. (Ich habe auch lieber

self.foo = nil 

in meinem deallocs)

+0

Apple empfiehlt aus gutem Grund, Setter und Getter in Init und Dealloc zu verwenden. Zum einen ist das Objekt bei init/dealloc unvollständig definiert (insbesondere bei Unterklassen) und daher kann der Aufruf anderer Methoden (einschließlich Setter/Getter) zu fehlerhaftem Verhalten führen. Betrachten Sie den Fall, dass der Setter überschrieben wird oder ein anderes Objekt die Eigenschaft beobachtet. –

+0

Können Sie mich auf diese Dokumentation verweisen? Es ist schwierig, mit den Updates der Dokumentation synchron zu bleiben. – IlDan

0

Sie die Lage sein wird, herum zu erhalten, die sowohl das Instanz-Variable zu deklarieren und die Eigenschaft einmal 32-Bit-Computer vergessen, als die 64-Bit-Laufzeit kann Instanzvariablen synthetisieren. Aber Sie können in einer Sprache, in der Dinge in einer Header-Datei deklariert und in einer anderen implementiert werden müssen, nicht vollständig DRY sein. Die Sprache muss dupliziert werden. Der einzige Weg wäre eine Metasprache.

Sie können Skripts verwenden, um die Wiederholung der wiederholten Eingabe desselben Variablenbausteins zu vermeiden, aber sie wird immer noch im Code enthalten sein.

Übrigens glaube ich nicht, dass die @ synthesize-Anweisung doppelte Informationen sind. Nichts anderes in Ihrem Code gibt an, welche Accessoren verwendet werden, um die Eigenschaft zu erhalten.

1

Da Sie erwähnt haben, dass Sie neu in Objective-C sind, möchte ich sicherstellen, dass Sie wissen, dass Sie keine Eigenschaften für jede Instanzvariable in Ihren Klassen erstellen müssen, und in der Tat sollten Sie wahrscheinlich nicht t.

Eigenschaften stellen eine Schnittstelle dar, die Ihre Klasse für andere Klassen bereitstellt. Diese Schnittstelle entspricht nicht unbedingt der internen Implementierung der Klasse.In den Fällen, in denen sie identisch sind, macht es die Syntax der deklarierten Eigenschaften (relativ) einfach, dies auszudrücken.

Wenn Ihre Klassen den Großteil ihres internen Status über Eigenschaften offen legen, sollten Sie sich das Design genauer ansehen und überlegen, ob Sie durch Verschieben der Verantwortlichkeiten ein einfacheres Design erhalten.

3

Diese Seite http://pragprog.com/magazines/2010-07/not-quite-new-in-ios- Ansprüche, dass Sie die Variablendeklaration fallen kann, ist es bis zu 2 Wiederholungen nur :)

#import <UIKit/UIKit.h> 
@interface MoveMeViewController : UIViewController { 
} 

@property(nonatomic, retain) IBOutlet UIImageView *imageView; 
@end 
Verwandte Themen