Einige Fragen zur automatischen Referenzzählung im iOS5 SDK

134

Ich entwickle gerade eine App für das iPad. Die Entwicklung für iOS 4.2 hat begonnen und wird nun für iOS 4.3 fortgesetzt (und ich denke, sie wird abgeschlossen sein). Ich habe gerade über ARC in iOS 5 gelesen und im Grunde habe ich verstanden, dass wir niemals mehr Objekte freigeben und aufbewahren müssen. Meine Fragen sind:

  1. Muss ich alle [myObject retain]und [myObject release]Anweisungen aus meinem Code entfernen, wenn ich mich für ein Upgrade auf iOS 5 entscheide ?

  2. Wenn ich mit ARC eine neue App für iOS 5 entwickle, muss ich dann eine Art "Retro-Kompatibilitäts" -Prüfung durchführen? dh: muss ich die Version von iOS überprüfen und den Aufruf beibehalten und entsprechend freigeben? Ist ARC also grundsätzlich für alle iOS-Versionen oder nur für iOS 5 verfügbar?

Luke47
quelle

Antworten:

150

Wenn ich mich für ein Upgrade auf iOS 5 entscheide, muss ich alle Anweisungen [myObject keep] und [myObject release] aus meinem Code entfernen?

Ja, aber XCode 4.2 enthält ein neues Tool "Zu Objective-C ARC migrieren" (im Menü Bearbeiten-> Refaktor), das dies für Sie erledigt. Dealloc zu nennen ist eine andere Geschichte. Wie in den Kommentaren erwähnt, besagt die Clang-Referenz, dass Sie die Dealloc-Methode beibehalten sollten:

Begründung: Obwohl ARC Instanzvariablen automatisch zerstört, gibt es immer noch legitime Gründe, eine Dealloc-Methode zu schreiben, z. B. die Freigabe nicht aufbewahrbarer Ressourcen. Das Versäumnis, [super dealloc] in einer solchen Methode aufzurufen, ist fast immer ein Fehler.

Sie aktivieren ARC mit einem neuen Compiler-Flag -fobjc-arc. ARC wird in Xcode 4.2 für Mac OS X 10.6 und 10.7 (64-Bit-Anwendungen) sowie für iOS 4 und iOS 5 unterstützt. (Schwache Referenzen werden in Mac OS X 10.6 und iOS 4 nicht unterstützt.) In Xcode 4.1 gibt es keine ARC-Unterstützung.

- -

Wenn ich mit ARC eine neue App für iOS 5 entwickle, muss ich dann eine Art "Retro-Kompatibilitäts" -Prüfung durchführen? Dh: Muss ich die Version von iOS überprüfen und die Aufbewahrung und Freigabe entsprechend aufrufen? Ist ARC also grundsätzlich für alle iOS-Versionen oder nur für iOS 5 verfügbar?

Nein, denn ARC zaubert zur Kompilierungszeit und nicht zur Laufzeit.

Anstatt sich merken zu müssen, wann Retain, Release und Autorelease verwendet werden sollen, wertet ARC die Lebensdaueranforderungen Ihrer Objekte aus und fügt beim Kompilieren automatisch die entsprechenden Methodenaufrufe für Sie ein. Der Compiler generiert auch geeignete Dealloc-Methoden für Sie.

Weitere Informationen zu ARC: http://clang.llvm.org/docs/AutomaticReferenceCounting.html

Henrik P. Hessel
quelle
Ich danke Ihnen für Ihre Erklärung!
Luke47
4
Dies ist nicht 100% korrekt. Es gibt einen Compiler-Schalter, der bestimmt, ob ARC aktiviert ist oder nicht. Ich glaube, ARC benötigt auch Laufzeitunterstützung. Wenn Sie also möchten, dass Ihre App unter iOS 4.x funktioniert, müssen Sie Ihre Aufbewahrungen und Releases beibehalten und sicherstellen, dass ARC ausgeschaltet ist.
JeremyP
8
@JeremyP - iOS 4.0 wird in der Tat als Ziel für ARC-Anwendungen unterstützt, sodass kein manueller Referenzzählcode erforderlich ist, um diese ältere Plattform anzusprechen. iPhone OS 3.x vielleicht, aber ich kann mir vorstellen, dass Apple die Unterstützung als Zielplattform einstellt, sobald 5.0 ausgeliefert wird, wie dies bei 2.x der Fall war, als 4.0 herauskam.
Brad Larson
5
@Brad Die Installationsbasis für iOS4 beträgt bereits mehr als 95%. Ich denke, es ist sicher, die iOS3-Unterstützung trotzdem einzustellen.
Henrik P. Hessel
2
Sie entfernen nicht dealloc, Sie entfernen nur alle Ihre releases und [super dealloc]davon. Und in 99,9% werden deallocnur Objekte freigegeben, sodass Sie sie entfernen. Objekte müssen jedoch noch andere Bereinigungsaufgaben ausführen, die nicht ausgeführt werden release(Schließen von Dateien, Entfernen von Beobachtern usw.).
Stanislav Yaglo
8

Q1: NEIN, wenn Sie einen vorhandenen Code haben, können Sie ihn weiterhin so verwenden, wie er mit dem -fno-objc-arc ist. Sie können ARC für jede Datei selektiv deaktivieren.

Wenn Sie ARC für MEHRERE Dateien deaktivieren möchten :

  1. Wählen Sie die gewünschten Dateien unter Ziel / Phasen erstellen / Quellen kompilieren in Xcode aus
  2. DRÜCKEN SIE EINGABE . (Doppelklick wählt nur eine Datei aus)
  3. Typ -fno-objc-Bogen
  4. Drücken Sie die Eingabetaste oder Fertig

F2: NEIN, das Ziel kann so niedrig wie iOS 4.0 sein

Tibidabo
quelle
7

Soweit ich weiß und soweit mein iPhone / iPod mit iOS 5 bzw. iOS 4.3 funktioniert, ist alles ziemlich automatisch. Eine App, die ich für 4.0 gestartet und "aktualisiert" habe, um mit Xcode für iOS 5.0 zu arbeiten, wirft niemals eine Warnung in Bezug auf das Freigeben und Beibehalten auf, obwohl sie über jeden Dealloc usw. verteilt ist. Einige der gleichen Codes, die ich eingefügt habe (kopierte die Datei) in ein neues Projekt, das mit Xcode für iOS 5 erstellt wurde, enthält viele, viele Warnungen. Es scheint also, dass Sie nicht alle diese Anrufe entfernen müssen, und nein, es passt es irgendwie automatisch an ältere Versionen an. Beim Profilieren meines iPod werden keine Speicherlecks oder andere Anzeichen für fehlerhafte Freigabe / Freigabe angezeigt. Hilft das?

Dylan Gattey
quelle
Die neueste Beta-Version fordert mich tatsächlich auf, alle Zuweisungsaufrufe zu entfernen, und das war's auch schon. Sie können weiterhin behalten / freigeben, aber das System hat das letzte Wort.
Dylan Gattey
5

In Bezug auf diesen Teil Ihrer Frage

Wenn ich mit ARC eine neue App für iOS 5 entwickle, muss ich dann eine Art "Retro-Kompatibilitäts" -Prüfung durchführen? Dh: Muss ich die Version von iOS überprüfen und die Aufbewahrung und Freigabe entsprechend aufrufen? Ist ARC also grundsätzlich für alle iOS-Versionen oder nur für iOS 5 verfügbar?

Es sollte beachtet werden, dass der iOS 5-Compiler die "Retro-Kompatibilität" übernimmt (er fügt tatsächlich den Code hinzu, damit die Aufbewahrung / Freigabe im Wesentlichen funktioniert), aber wenn Sie nicht für iOS 5.0 kompilieren, können Sie ihn nicht weakals Schlüsselwort verwenden . Stattdessen verwenden Sie assign. Das ist bedauerlich: weakist ein großer Vorteil (keine baumelnden Zeiger, niemals!). Sehen Sie meine Frage hier für eine Diskussion weak, assignund ARC.

Dan Rosenstark
quelle
2

Wenn Sie ARC deaktivieren können, indem Sie das neue Compiler-Flag -fobjc-arc nicht verwenden, müssen Sie den Code in Zukunft nicht neu schreiben - ich denke (?)

oliver
quelle