webentwicklung-frage-antwort-db.com.de

Einige Fragen zur automatischen Referenzzählung im iOS5 SDK

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, das wird noch abgeschlossen). Ich habe gerade über ARC in iOS 5 gelesen und im Grunde genommen habe ich verstanden, dass wir Objekte nie mehr freigeben und aufbewahren müssen. Meine Fragen sind:

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

  2. Wenn ich mit ARC eine neue App für iOS 5 entwickle, muss ich dann eine Art "Retro-Kompatibilitätsprüfung" durchführen? d. h .: Muss ich die Version von iOS überprüfen und anrufen, um sie beizubehalten und entsprechend freizugeben? Gibt es ARC grundsätzlich für alle iOS-Versionen oder nur für iOS 5?

134
Luke47

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

Ja, aber XCode 4.2 enthält ein neues Tool "Auf Objective-C ARC migrieren" (im Menü Bearbeiten-> Refaktor), das dies für Sie erledigt. Das Aufrufen von Dealloc 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, wie z. B. die Freigabe nicht aufbewahrbarer Ressourcen. Das Nichtaufrufen von [super dealloc] in einer solchen Methode 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.) Es gibt keine ARC-Unterstützung in Xcode 4.1.

-

Wenn ich mit ARC eine neue App für iOS 5 entwickle, muss ich dann eine Art "Retro-Kompatibilitätsprüfung" durchführen? D. h .: Muss ich die Version von iOS überprüfen und entsprechend beibehalten und freigeben? Gibt es ARC also grundsätzlich für alle iOS-Versionen oder nur für iOS 5?

Nein, weil ARC seine magische Wirkung auf die Kompilierungszeit und nicht auf die Laufzeit ausübt.

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

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

150

F1: NEIN. Wenn Sie einen vorhandenen Code haben, können Sie diesen wie bisher verwenden. Mit - fno-objc-arc können Sie ARC für jede Datei selektiv deaktivieren.

Wenn Sie ARC deaktivieren auf MEHRERE Dateien:

  1. Wählen Sie die gewünschten Dateien unter Target/Build Phases/Compile Sources in Xcode aus
  2. EINGABETASTE. (Doppelklick wählt nur eine Datei aus)
  3. Geben Sie - fno-objc-arc ein
  4. Drücken Sie Enter oder Done

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

8
Tibidabo

Soweit ich weiß und mein iPhone/iPod mit iOS 5 bzw. iOS 4.3 funktioniert, geschieht alles ganz automatisch. Eine App, die ich für 4.0 gestartet und "aktualisiert" habe, um mit Xcode für iOS 5.0 zu arbeiten, warnt mich nie vor dem Freigeben und Beibehalten, auch wenn sie sich über alle Freigaben usw. erstreckt (kopierte die Datei) in ein neues Projekt erstellt mit Xcode für iOS 5 hat viele, viele Warnungen. Es scheint also, dass Sie nicht alle diese Anrufe entfernen müssen, und nein, es passt es irgendwie automatisch für ältere Versionen an. Bei der Profilerstellung für meinen iPod werden keine Speicherverluste oder andere Anzeichen für fehlgeschlagene Freigabe/Freigabe angezeigt. Hilft das?

7
Dylan Gattey

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ätsprüfung" durchführen? D. h .: Muss ich die Version von iOS überprüfen und entsprechend beibehalten und freigeben? Gibt es ARC grundsätzlich für alle iOS-Versionen oder nur für iOS 5?

Es sollte beachtet werden, dass der iOS 5-Compiler die "Retro-Kompatibilität" übernimmt (es FÜGT tatsächlich den Code hinzu, damit Retain/Release im Wesentlichen funktioniert), aber wenn Sie nicht für iOS 5.0 kompilieren, können Sie weak als Schlüsselwort. Stattdessen verwenden Sie assign. Das ist bedauerlich: weak ist ein riesiger Vorteil (niemals baumelnde Zeiger!). Siehe meine Frage hier für eine Diskussion von weak, assign und ARC.

5
Dan Rosenstark

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.

2
oliver