2012-03-30 20 views
0

Ich habe viele Objekte verweisen auf die gleiche Klasse von gespeicherten Daten. In früheren Programmen habe ich Singletons benutzt, aber ich versuche diese Praxis aufzugeben und benutze sie nur als letzten Ausweg, wenn nötig, hauptsächlich wegen ihres schlechten Rufs (und in der Tat habe ich sie in der Vergangenheit missbraucht).Schwache "assign" Referenzen statt Singletons

Aber ich frage mich, wie viel ein Vorteil meiner neuen Technik ist. Ich erstelle einfach schwache Referenzen auf den gleichen Datensatz, so dass eine Reihe von Klassen auf denselben Speicher zeigt, um Daten nach Bedarf zu ziehen. Wie zum Beispiel:

@property (nonatomic, assign) MyDataClass*mydata;

In einem benutzerdefinierten init der Klasse, übergeben I als Methodenparameter eine Referenz, so ist die property zuordnet dieser Referenz.

Ist dies eine gültige, akzeptable Möglichkeit, Dinge zu tun? Ich habe Probleme, einen großen organisatorischen Vorteil zu finden, um Singletons zu vermeiden.

+0

Warum ist das "zuweisen" statt "behalten"? – Chuck

+0

weil es eine schwache Referenz ist und die Klasse das Objekt nicht besitzt – johnbakers

Antwort

0

Das Muster, das Sie verwenden, ist in Ordnung, schließlich wird dieses Muster in allen Standard-C++ - Programmen ohne Referenzzählung oder andere erweiterte Speicherverwaltungstools verwendet. Die einzige Sache, die Sie sicherstellen müssen, dass Ihre Objekthierarchie strikt die Schwäche der Referenz respektiert, d. H. Die Abhängigkeit des Objekts, das die Referenz auf das Objekt hat, das sich hinter dieser Referenz befindet. Mit anderen Worten, Sie müssen immer sicherstellen, dass der Eigentümer der Referenz gelöscht wird vor die Referenz und Sie müssen manuell sicherstellen, da Sie die Referenzzählung nicht verwenden.

Dies bedeutet mehr Verantwortung für Sie, den Programmierer, da Sie immer die totale Kontrolle über die Lebensdauer Ihrer Objekte haben müssen. Es ist ziemlich leicht, einen Fehler mit Ihrem Muster zu machen, da Sie aus dem Code mit der schwachen Referenz nicht wissen können, ob das ursprüngliche Objekt noch existiert oder gelöscht wird. Sie müssen dies mit Ihrem Designmuster sicherstellen.

Aus diesem Grund schlage ich nicht vor, die beiden Ansätze zu "mischen", dh schwache Referenzen auf ein Objekt zu haben, das durch eine retain-Eigenschaft außer Kontrolle geraten könnte (wenn sich der Wert der Eigenschaft ändert) Ihr Objekt), ein autorelease oder durch ARC.

Referenzzählung wurde eingeführt, um dem Programmierer die Verantwortung zu entziehen und das Schreiben von sicherem Code zu erleichtern. Ihr Muster ist in Ordnung, es wird von Millionen von C++ - Programmen verwendet, aber Sie müssen sich Ihrer Verantwortung bewusst sein.

0

In der Regel sollten Sie nur eine Singleton-Klasse für Objekte verwenden, bei denen es nicht sinnvoll ist, dass mehr als eine von ihnen existiert. Andernfalls ist es am besten, sie zu vermeiden, da sie die Kopplung einführen: Jede Klasse, die den Singleton verwendet, endet eng mit dem Singleton.

Es ist in Ordnung, Referenzen auf Sachen zu übergeben. Sie müssen natürlich keine schwachen Referenzen sein, außer wenn es notwendig ist, um Rückhaltezyklen zu vermeiden.

Wenn Sie feststellen, dass Sie die gleichen Objekte zwischen einer großen Anzahl von Klassen weitergeben, sollten Sie darüber nachdenken, über Verantwortlichkeiten zu entscheiden und Ihre App neu zu strukturieren.

0

Behalten/Zuweisen und Verwenden von Singletons sind keine sich gegenseitig ausschließenden Muster. Ich würde nicht so zögerlich gegen den Singleton sein, ich war zuerst, als ich mit iOS angefangen habe.

Als Entwickler von Java-Webanwendungen waren Singletons aufgrund der engen Kopplung schlecht, und vor allem, wenn Sie Ihre Anwendung über einen Load Balancer/(Cloud jetzt) ​​verteilen wollten ... dann würde Ihr Singleton zu einem Engpass - und wäre nicht leicht skalierbar.

Es gab auch Probleme mit Unit-Tests mit Singletons, und es musste seinen Zustand während Tests zurücksetzen oder sogar versuchen, es zu verspotten.

Allerdings, in Objective-C und iOS-Entwicklung - ich sehe nicht wirklich viele Nachteile für Singletons. Ihre App wird nicht skaliert und die SDK ist bereits mit Singletons übersät, um Ihre Komponententests zu behindern.