Deaktivieren Sie die automatische Referenzzählung für einige Dateien

183

Ich habe das iOS 5 SDK heruntergeladen und festgestellt, dass ARC eine großartige Funktion des neuen Apple-Compilers ist. Derzeit unterstützen viele Frameworks von Drittanbietern ARC nicht. Könnte ich ARC für meinen neuen Code verwenden und den aktuellen Aufbewahrungs- / Freigabecode unverändert lassen? Der ARC-Konverter funktioniert hier nicht, da einige Frameworks wie JSONKit mithilfe des Konverters nicht in ARC konvertiert werden können.

Bearbeiten:

Die Antwort besteht darin -fno-objc-arc, den Compiler-Flags die Dateien hinzuzufügen , für die Sie kein ARC benötigen. In Xcode 4 können Sie dies unter Ihrem Ziel tun -> Phasen erstellen -> Quellen kompilieren.

nichtschmelzend
quelle
2
Zur Verdeutlichung fügen Sie es einfach der .mDatei hinzu. Nicht die .hDatei.
ma11hew28
Ich habe dieses Gespräch gefunden: github.com/gowalla/AFNetworking/issues/36 Vielleicht hilft es jemandem, JSONKit in ein von iOS5 ARC unterstütztes Projekt zu integrieren ;-) Aber ich habe es im Moment noch nicht ausprobiert ...
Diese Methode hat bei mir funktioniert. Ich habe meinem Projekt AsyncUdpSocket für UDP Multicast hinzugefügt, und diese Dateien [mindestens die aktuelle Version] unterstützen ARC NICHT. Daher habe ich die oben beschriebene Methode verwendet, um das Compiler-Flag zur Datei AsyncUdpSocket.m hinzuzufügen, und ich kann den Code für meine Anwendung einwandfrei verwenden.
Ashu Joshi
2
Das funktioniert perfekt! Besonderheiten: Gehen Sie zu Ihrem Ziel und wählen Sie Phasen erstellen und dann Quellen kompilieren. Wenn Sie auf die betreffende .m-Datei doppelklicken, wird ein Feld angezeigt, in das Sie Folgendes eingeben / einfügen können: "-fno-objc-arc"
mpemburn

Antworten:

73

Die öffentlichen ARC-Dokumente sind zwar in diesem Punkt nicht direkt klar, scheinen jedoch darauf hinzudeuten, dass die Klassen in ein einziges Programm integriert werden können, solange jede Klasse entweder nur ARC oder alle manuell verwaltet wird.

Sie können ARC und Nicht-ARC nicht nur in einer Klasse mischen. Das Dokument sagt , dass das Senden retain, release, autorelease, oder retainCountNachrichten mit allen Mitteln (einschließlich Zeitgeber und verzögert führt, die den Einsatz @selector) in ARC Code verboten ist. Sie können also in einer ARC-Klasse kein Nicht-ARC ausführen (da die erforderlichen Nachrichten gesperrt sind) und in einer Nicht-ARC-Klasse kein ARC ausführen (da ARC Syntaxelemente hinzufügt, die ohne ARC ungültig sind).

Das gleiche Dokument ist etwas klarer, ob Sie Nicht-ARC-Bibliotheken / Frameworks in ein ARC-Programm integrieren können: Ja. Es wird nicht erwähnt, ob Sie ARC-Bibliotheken / Frameworks in einem Programm verwenden können, in dem Ihr gesamter Code nicht ARC ist, aber angesichts all der oben genannten Punkte scheint die Implikation ja zu sein.

Peter Hosey
quelle
Danke dir! Ich habe herausgefunden, wie ARC für vorhandene Nicht-ARC-Klassen deaktiviert werden kann.
Nonamelive
Können Sie uns mitteilen, was Sie tun?
David H
1
@ David H: Wenn Sie dies an den Fragesteller richten wollten, sollten Sie beachten, dass der Fragesteller seine Lösung in die Frage bearbeitet hat.
Peter Hosey
Die ARC-Kompilierung kann in HEADER-Dateien nicht deaktiviert werden. Clang kompiliert die Schnittstelle / den Header NICHT basierend auf der Kompilierung der Implementierungs- / Methodendatei. Daher müssen Header-Dateien in einer gemischten Zusammenstellung sowohl mit ARC als auch mit Nicht-ARC kompatibel sein. Ich betrachte dies als einen Fehler im Compiler.
Carmin
1
@ Carmin: Ist es nicht. Der Compiler betrachtet Header-Dateien nur dann, wenn Sie es ihm mitteilen, was Sie normalerweise nur tun, indem #importSie sie aus Moduldateien verwenden. Die Einstellung für Compiler-Flags gilt für jede Moduldatei (genauer gesagt für jede Datei in der Erstellungsphase „Quellen kompilieren“). Der Compiler kann nicht wissen, ob er ARC für eine andere Datei verwenden soll oder nicht, es sei denn, er erbt die Auswahl, die er für die Moduldatei getroffen hat, mit der er begonnen hat.
Peter Hosey
78

Es ist nicht sehr intuitiv, ARC für MEHRERE Dateien zu deaktivieren. Eine Weile habe ich es einzeln gemacht, bis ich herausgefunden habe, wie das geht.

  1. Wählen Sie die gewünschten Dateien unter Ziel / Phasen erstellen / Quellen in Xcode kompilieren aus (CMD + Klick oder Umschalt + Klick).
  2. PRESS ENTER (Doppelklick wird die Auswahl zurückgesetzt, so dass es Arbeit does't)
  3. Typ -fno-objc-Bogen
  4. Drücken Sie die Eingabetaste oder Fertig
Tibidabo
quelle
1
Es ist nicht wirklich eine Antwort auf die hier gestellte Frage, aber trotzdem ein verdammt guter Tipp! Gewählt +1
Kristof Van Landschoot
Sie haben Recht, es ist nicht, aber ich habe immer nur nach dem Schalter gegoogelt und diese Antwort ist einer der Top-Hits. Ich dachte heutzutage wissen die meisten Leute bereits die Antwort, aber nicht diesen "Tipp"
Tibidabo
35

Wenn Sie die automatische Referenzzählung für einige Dateien deaktivieren möchten, müssen Sie nur die folgenden Schritte ausführen. Fügen Sie unter Ziele -> Phasen erstellen -> Quellen kompilieren Compiler-Flags hinzu.

xcode

Das verwendete Flag ist -fno-objc-arc. Drücken Sie nach dem Schreiben die Eingabetaste.! Sie müssen auf die rechte Spalte der Zeile unter Compiler Flags doppelklicken. Hoffe es hilft Danke :)

Nikhil Bansal
quelle
14
Sie können dieselbe Methode verwenden, um ARC für eine bestimmte Datei in einem Nicht-ARC-Projekt mithilfe des Flags zu aktivieren-fobjc-arc .
lnafziger
Die ARC-Kompilierung kann in HEADER-Dateien nicht deaktiviert werden. Clang kompiliert die Schnittstelle / den Header NICHT basierend auf der Kompilierung der Implementierungs- / Methodendatei. Daher müssen Header-Dateien in einer gemischten Zusammenstellung sowohl mit ARC als auch mit Nicht-ARC kompatibel sein. Ich betrachte dies als einen Fehler im Compiler.
Carmin