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:
Wenn ich mich für ein Upgrade auf iOS 5 entscheide, muss ich alle [myObject retain]
und [myObject release]
Anweisungen aus meinem Code?
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?
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
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:
F2: NEIN, das Ziel kann so niedrig wie iOS 4.0 sein
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?
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.
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.