Best Practice für iOS 5 (Freigeben / Beibehalten?)


109

Was ist als Anfänger für iPhone-Programmierer die beste Vorgehensweise zum Schreiben von Apps, die entweder mit iOS 5 oder älteren Versionen verwendet werden sollen? Sollte ich die Freigabe / Aufbewahrung von Daten weiterhin verwenden oder sollte ich das ignorieren? Ist das wichtig?


1
Verwenden Sie ARC und befolgen Sie die hier beschriebenen Best Practices: amattn.com/2011/12/07/arc_best_practices.html Wenn Sie dies tun, werden Sie feststellen, dass ARC "einfach funktioniert". Wenn Sie diese Praktiken nicht befolgen, werden Sie am Ende Lecks haben und viel Zeit damit verbringen, sie aufzuspüren ....
n13

Antworten:


98

Es liegt an dir. Sie können Apps mit ARC (Automatic Reference Counting) schreiben, und Xcode schreibt "Klebercode", damit Ihre ARC-fähigen Apps unter iOS 4 ausgeführt werden können, ohne dass Änderungen erforderlich sind. Bestimmte Dinge funktionieren jedoch nicht, und am auffälligsten ist, dass viele Bibliotheken, die Sie möglicherweise verwenden möchten, (manchmal) unzählige Fehler verursachen und Sie sie erst verwenden können, wenn die Entwickler ein mit ARC kompatibles Update veröffentlichen.


Bearbeiten : Ich habe kürzlich festgestellt, dass Sie ARC pro Datei deaktivieren können. Siehe die Antwort von pixelfreak . Mein Rat bleibt also bestehen, aber jetzt sollten die Bibliotheken von Drittanbietern nicht aktualisiert werden müssen, um mit ARC zu arbeiten.

Apple sagt Folgendes zum Deaktivieren von ARC für bestimmte Dateien:

Wenn Sie ein Projekt zur Verwendung von ARC migrieren, wird das Compiler-Flag -fobjc-arc als Standard für alle Objective-C-Quelldateien festgelegt. Sie können ARC für eine bestimmte Klasse mit dem Compiler-Flag -fno-objc-arc für diese Klasse deaktivieren. Öffnen Sie in Xcode auf der Registerkarte "Zielphasen erstellen" die Gruppe "Quellen kompilieren", um die Liste der Quelldateien anzuzeigen. Doppelklicken Sie auf die Datei, für die Sie das Flag setzen möchten, geben Sie -fno-objc-arc in das Popup-Fenster ein und klicken Sie dann auf Fertig.

Geben Sie hier die Bildbeschreibung ein

Die vollständige Übergangsanleitung finden Sie hier .


15
ARC kann offensichtlich "pro Datei" deaktiviert werden, was möglicherweise die Verwendung älterer Bibliotheken ermöglicht ... Aber ich habe nicht damit gespielt, daher weiß ich es noch nicht. Ich bin allerdings ziemlich aufgeregt darüber. Können Sie sich eine Welt vorstellen, in der iOS-Entwickler nicht schwitzen müssen? Worüber werden wir hier bei SO sprechen? ;-)
Dan Ray

45
Gerade als ich endlich all diesen Speicherverwaltungs-Mist in den Griff bekommen habe, machen sie ihn irrelevant. ARBEITSPLÄTZE!!!
Kongress

@ Dan: Du machst keine Witze, es kann selektiv ausgeschaltet werden? Bitte geben Sie einen Link, der mir wichtig ist! : D
sudo rm -rf

1
Ich glaube, der Compiler ist jetzt nicht unter NDA. Um einige Dateien (normalerweise Quellordner von Drittanbietern) selektiv von Ihrem Code auszuschließen, fügen Sie dies einfach als Compiler-Option zu jeder Datei hinzu: -fno-objc-arc
blackjack75

2
@Yar: Ja das bist du. Ich wünschte, es wäre so einfach, aber leider sind nicht alle Bibliotheken so einfach. Nehmen wir JSONKitzum Beispiel. Versuchen Sie, dies durch die ARC-Prüfung zu führen. Du wirst sehen, was ich meine. ;)
sudo rm -rf

170

Für alle, die noch neugierig sind, wie ARC für einzelne Dateien deaktiviert werden kann, habe ich Folgendes getan:

  1. Gehen Sie zu Ihren Projekteinstellungen unter Build Phases > Compile Sources
  2. Wählen Sie die Dateien aus, für die ARC deaktiviert werden soll, und fügen Sie die Compiler-Flags -fno-objc-arc hinzu . Sie können Flags für mehrere Dateien auf einmal setzen, indem Sie die Dateien auswählen und dann die Eingabetaste drücken.

Ich weiß nicht, ob dies der empfohlene Weg ist, aber es funktioniert für mich.

PS: Ich habe diese Informationen von clang.llvm.org hier gesammelt , die öffentlich zugänglich sind, also nicht unter NDA.


1
Wenn ich dieses Flag mit einer Bibliothek verwende, funktioniert es, aber sobald ich die lib .h-Datei in eine ARC-Klasse einbinde, beschwert sich Xcode, als hätte ich das Flag dort nicht. Konnten Sie ältere Bibliotheken dazu bringen, mit dieser Flagge zu arbeiten?
Casey

Ich kann ASIHttpRequest und SBJson zum Laufen bringen (ich erhalte 1 Warnung zur Strukturverwendung in Reachability.h). Ich habe das Flag in alle Implementierungsdateien eingefügt.
Pixelfreak

Alle Implementierungsdateien oder nur die .h's? In meinem Abschnitt "Quellen kompilieren" des Projekts sind nur die Header-Dateien und keine Implementierungsdateien enthalten. Ich kann sie hinzufügen, aber es nicht scheint , eine andere Wirkung zu haben. Als Referenz versuche ich, einen REST-Parser zum Laufen zu bringen. ( github.com/mirek/NSMutableDictionary-REST.framework )
Casey

1
Aha! Ich habe mir die Fehler nicht genau genug angesehen. Sie sind andere Fehler als ohne das Flag. Ich musste nur den Auto-Release-Pool aus dem Code entfernen und wha-la!
Casey

Wenn ich mehrere Dateien auswähle und die Eingabetaste drücke, wie hier vorgeschlagen, wurden alle in den Erstellungsphasen aus den 'Kompilierungsquellen' entfernt. Ich musste sie einzeln auswählen. Ich bin mir nicht sicher, ob ich etwas falsch mache.
Gopalakrishnan Subramanian

10

iOS 5 steht noch unter einer NDA und wird wahrscheinlich bis zur Veröffentlichung der öffentlichen Version verfügbar sein. Wenn Sie ein Entwicklerkonto haben, besuchen Sie die Apple Developer Forums und fragen Sie dort nach.

Bei früheren Versionen müssen Sie Referenzen zählen und entsprechend aufbewahren und freigeben. Lesen Sie das Handbuch zur Speicherverwaltung .

Bearbeiten: Hier ist eine öffentliche Spezifikation für die automatische Referenzzählung und ein Zitat von der öffentlichen iOS 5-Seite :

Die automatische Referenzzählung (ARC) für Objective-C macht die Speicherverwaltung zur Aufgabe des Compilers. Wenn Sie ARC mit dem neuen Apple LLVM-Compiler aktivieren, müssen Sie nie wieder beibehalten oder freigeben, was den Entwicklungsprozess erheblich vereinfacht und gleichzeitig Abstürze und Speicherverluste reduziert. Der Compiler hat ein umfassendes Verständnis Ihrer Objekte und gibt jedes Objekt in dem Moment frei, in dem es nicht mehr verwendet wird. Daher werden Apps so schnell wie nie zuvor ausgeführt und bieten eine vorhersehbare, reibungslose Leistung.


Funktionieren mit iOS 5 entwickelte Anwendungen mit älteren iPhones?
Geekgirl

Sie können die Tools verwenden, um für ältere Betriebssysteme zu entwickeln, aber Sie können die neuen Technologien wie ARC nicht verwenden. Wenn Sie auf ältere Betriebssysteme abzielen möchten, müssen Sie die manuelle Speicherverwaltung durchführen. Wenn Sie ARC verwenden möchten, müssen Sie Benutzer auf iOS 5 beschränken.
Nevan King

1
Ein Verweis auf ARC befindet sich auf einer öffentlich zugänglichen Apple-Seite developer.apple.com/technologies/ios5, sodass zumindest einige Teile davon nicht unter NDA fallen.
Cobbal

8
Eigentlich stimmt das nicht ganz. Sie können mit ARC für iOS 4 erstellen. Zitat des Apple-Ingenieurs: " Für iOS 4 und Mac OS 10.6 fügt der Compiler Ihrer App ein wenig Laufzeit-Kompatibilitäts-Klebercode hinzu. Dies funktioniert für alles außer für __schwache Variablen, die mehr Unterstützung erfordern, als der Kompatibilitätscode bieten kann. ARC unter iOS 4 ist einfacher als Nicht-ARC-Code, aber nicht so einfach wie ARC unter iOS 5. "Übrigens, die WWDC-Zeitplan-App wurde mit ARC geschrieben und funktionierte unter iOS 4 einwandfrei!
Sudo rm -rf

3
Ja; Dies wurde jedoch beim ARC-Vortrag qualifiziert, da nur 4.3.x-Ziele den "Kompatibilitätskleber" erhalten.
Alan Zeino

4

Die Details sind derzeit leicht / unter NDA, aber Apple hat die automatische Referenzzählung (ARC) in iOS 5 implementiert, wie hier beschrieben: http://developer.apple.com/technologies/ios5/

Wenn Sie eine neue App in Xcode 4 mit dem iOS 5 SDK entwickeln, können Sie die Aufbewahrungs- / Freigabezählung ignorieren.

[edit] sudo rm -rf macht einen guten Punkt; Bibliotheken von Drittanbietern können erheblich betroffen sein


Funktionieren mit iOS 5 entwickelte Anwendungen mit älteren iPhones?
Geekgirl

Es funktioniert auf iPhones mit iOS 5, also nur auf dem iPhone 3GS oder iPhone 4. Ich glaube nicht, dass es iOS 4 unterstützt, aber andererseits wird es beim Kompilieren von LLVM ausgeführt, sodass möglicherweise eine Binärdatei für erstellt werden kann iOS 4 und 5. Ich empfehle dringend, ein iOS-Entwicklerkonto zu erstellen und mit den verfügbaren Optionen herumzuspielen.
Dominic

Wie Sudo in seinem Kommentar zu Nevans Antwort hervorhebt, können Sie mit ARC tatsächlich auf iOS 4.0 zurückgreifen, sodass ältere Geräte, auf denen dieses Betriebssystem ausgeführt werden kann, damit kompatibel sind.
Brad Larson

3

Niemand hat SystemConfiguration.framework erwähnt ? Bitte vergessen Sie nicht, es in Frameworks zu setzen . Ich habe kläglich mehrere Stunden damit verbracht, es zu realisieren.


Sie sollten erklären, warum.
John Riselvato

3

Es ist sicherlich die Wahl des Entwicklers oder des Teams. ARC (Automatic Reference Counter) hat die Arbeit etwas vereinfacht, indem der Speicher automatisch für Sie verwaltet wurde. Es wird freigegeben, aufbewahrt und gegebenenfalls freigegeben. Ich glaube, dass Sie Erfahrung in der Verwaltung des Speichers sammeln sollten, vorzugsweise in einer Testanwendung, wenn Sie dies noch nicht getan haben. Eine andere zu berücksichtigende Sache ist, ob Ihre Anwendung auf Bibliotheken von Drittanbietern basiert. Wenn diese nicht in ARC konvertiert wird, kann Ihre Anwendung nicht kompiliert werden. Die Wahl hängt offensichtlich von der jeweiligen Situation ab.


0

Setzen Sie das Flag in den Projekteinstellungen> Phasen erstellen> Quellen kompilieren als -fno-objc-arc

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.