2014-08-28 10 views
6

Ist es möglich, Apps mithilfe der manuellen Speicherverwaltung (anstelle der automatischen Referenzzählung) mit SWIFT zu schreiben?Swift ohne ARC

Kann ich retain und release mit Swift anrufen?

+0

Nach Kommentaren in meiner Antwort unten und @newacct Antwort, ich frage mich jetzt: Willst du ARC auf * einige * Objekte in Ihrem Projekt zu vermeiden, oder deaktivieren Sie ARC für das gesamte Projekt? Könnte das in Ihrer Frage explizit gemacht werden? – Antonio

Antwort

10

Sie retain und release auf Unmanaged<T> Werte aufrufen können. Unmanaged ist im Grunde Objektzeiger, die sich außerhalb der ARC-Verwaltung befinden. Sie müssten jedoch in verwaltete Zeiger konvertieren, um mit Cocoa-APIs zu interagieren.

Aber Sie möchten das nicht tun, außer in Ausnahmefällen. Und ein Projekt, das nicht in ARC konvertiert wird, ist keine solche Situation.

1

Hinweis 29. August 2014 - Meine Antwort unten nicht korrekt ist, ist es möglich, schauen @newacct Antwort

Nein, Sie können nicht. Lesen Sie mehr über Automatic Reference Counting.

Sie müssen einen sehr guten Grund haben, nicht ARC wollen

+3

kein wirklicher Grund - nur cuirious – YogevSitton

+1

Ah ok. Angst, dass du etwas komisches machen wolltest :) – Antonio

+0

Ich arbeite an einem Nicht-ARC-Projekt und frage mich, ob ich Swift-Code hinzufügen kann, ohne es in ein ARC-Projekt umzuwandeln. – YogevSitton

0

Es gibt derzeit keine Möglichkeit, ARC für swift so zu deaktivieren, wie Sie es mit objc können (z. B. pro Datei mit einem Compiler-Flag). Wie andere darauf hingewiesen haben, gibt es die APIs 'Unmanaged' und 'UnsafeMutablePointer', die für die Interaktion mit C-APIs konzipiert wurden und Ihnen in einigen Fällen die Arbeit mit ARC ermöglichen. Diese APIs sind jedoch umständlich und erfordern erhebliche Änderungen an Ihrem Code (z. B. für die Interaktion mit Arrays).

Die Swift Leute würden im Allgemeinen wollen, dass Sie Ihren Code neu schreiben, um Strukturen zu verwenden und Referenzprobleme zu vermeiden, wo es möglich ist. Aber das macht die Portierung von bestehendem Code schmerzhaft.

Es gibt einige Vorschläge in meinem anderen Beitrag in Bezug auf ARC Leistung hier: Swift Dictionary slow even with optimizations: doing uncessary retain/release? aber keine sind sehr befriedigend.

Ich bin so weit gegangen, Code zu schreiben, um den kompilierten Mach-O-Objektcode nachzubearbeiten und die ARC-Aufrufe von swift_retain/release aus einigen Klassen als ein Experiment zu entfernen. Aber ich hoffe wirklich, dass Swift jetzt offen ist und wir es einfach modifizieren können, um es in Zukunft flexibler zu machen.