webentwicklung-frage-antwort-db.com.de

Was sind die Vor- und Nachteile von ARC?

Welche Vor- und Nachteile hat die Verwendung des neuen Speicherverwaltungsstils für die automatische Referenzzählung (ARC) in einem iOS-Projekt?

Können Sie festlegen, dass ARC bei der Entwicklung mit dem iOS 5.0-SDK nicht verwendet wird?

Empfehlen Sie ARC oder Manual Reference Counting (MRC) für ein neues Projekt?

Kann eine Anwendung, die ARC verwendet, unter älteren Betriebssystemversionen als iOS 5.0 ausgeführt werden?

42

Welche Vor- und Nachteile hat die Verwendung des neuen Speicherverwaltungsstils für die automatische Referenzzählung (ARC) in einem iOS-Projekt?

Die Ausführung eines ARC-Programms ist nahezu identisch mit einer gut geschriebenen MRC. Das heißt, die Verhaltensunterschiede sind häufig nicht erkennbar, da sowohl die Reihenfolge der Vorgänge als auch die Leistung sehr eng sind.

Wenn Sie bereits wissen, wie Sie OS X- oder iOS-Apps mit manueller Referenzzählung (MRC) implementieren, fügt ARC nicht wirklich Funktionen hinzu, sondern ermöglicht es Ihnen lediglich, Referenzzählvorgänge aus Ihren Quellen zu entfernen.

Wenn Sie MRC nicht lernen möchten, sollten Sie zuerst ARC ausprobieren. Viele Menschen haben Probleme mit MRC oder versuchen, diese zu ignorieren (Beispiel: Ich habe eine Reihe von Objektentwicklern für den statischen Analysator eingeführt). Wenn Sie diese Probleme vermeiden möchten, können Sie mit ARC Ihr Verständnis verschieben. Sie können keine nicht trivialen objc-Programme schreiben, ohne die Referenzzählung und die Lebensdauer und die Beziehungen von Objekten zu verstehen, egal ob MRC, ARC oder GC. ARC und GC entfernen einfach die Implementierung aus Ihren Quellen und tun das Richtige in den meisten Fällen. Bei ARC und GC müssen Sie noch einige Anweisungen geben.

Ich habe dies nicht gemessen, aber es kann erwähnenswert sein, dass Kompilieren ARC-Quellen mehr Zeit und Ressourcen benötigen würden.

Wenn das Programm, das Sie entwickeln, die Referenzzählung eher locker verwendet (z. B. eine typische Anzahl von Autoreleases), können Sie durch Umschalten auf ARC könnte die Ausführungszeiten Ihres Programms und die maximale Speichernutzung erheblich verbessern.

Können Sie festlegen, dass ARC bei der Entwicklung mit dem iOS 5.0-SDK nicht verwendet wird?

Ja, mit CLANG_ENABLE_OBJC_ARC. ARC ist binär kompatibel, und alles, was wirklich passiert, ist, dass der Compiler sein Bestes tut, um die entsprechenden Referenzzähloperationen automatisch für Sie einzuführen, basierend auf den Deklarationen, die für die aktuelle Übersetzung sichtbar sind ( . Siehe meine Antwort hier als Warum ist die Sichtbarkeit der Übersetzung wichtig ? Daher können Sie es auch für einige Quellen in einem Projekt aktivieren und deaktivieren und für andere aktivieren.

Der gemischte Modus (einige MRC- und einige ARC-Quellen) ist jedoch ziemlich kompliziert und auf subtile Weise, insbesondere in Bezug auf Implementierungen, die vom Compiler dupliziert werden können (z. B. kann der Body einer Inline-Funktion falsch sein). Solche Mixed-Mode-Probleme sind nur sehr schwer zu isolieren. ObjC++ - Programme und -Quellen werden in dieser Hinsicht besonders schwierig sein. Darüber hinaus kann sich das Verhalten basierend auf Ihren Optimierungseinstellungen unterscheiden (als ein Beispiel). Ein Programm, das perfekt in einem Debug-Build funktioniert, kann ein Leck oder einen Zombie in der Version einführen.

Empfehlen Sie ARC oder Manual Reference Counting (MRC) für ein neues Projekt?

Persönlich werde ich einige Zeit bei MRC bleiben. Selbst wenn ARC in der Praxis getestet wurde, ist es wahrscheinlich, dass in komplexen Szenarien noch eine Reihe von Problemen auftreten, die Sie vermeiden sollten, die ersten zu kennen und zu debuggen. Die Garbage Collection von OS X ist ein Beispiel dafür, warum Sie möglicherweise warten möchten. Beispielsweise kann sich der Schalter ändern, wenn Objekte zerstört werden - Ihre Objekte werden möglicherweise früher zerstört und niemals in Pools mit automatischer Freigabe abgelegt. Es könnte auch die Reihenfolge ändern, in der Ivars freigesetzt werden, was einige Nebenwirkungen haben könnte.

Ich habe auch eine große Codebasis, für die ich keine Woche verlieren möchte, um diese Funktion zu testen. Abschließend ist mir noch die Abwärtskompatibilität wichtig.

Kann eine Anwendung, die ARC verwendet, unter älteren Betriebssystemversionen als iOS 5.0 ausgeführt werden?

Wenn Sie mit MRC entwickeln, ist es abwärtskompatibel. Wenn Sie mit ARC entwickeln, ist dies nicht unbedingt kompatibel. In der Tat kann es nicht einmal ohne ein wenig zusätzliche Arbeit kompiliert werden. Die Voraussetzungen für die Laufzeit sind in einigen früheren Versionen vorhanden. Siehe auch diese Frage . Wenn Sie Abwärtskompatibilität benötigen, ist ARC für einige Betriebssystemversionen keine Option.

Wenn Sie die Auswahl auf GC oder ARC beschränken möchten, würde ich ARC empfehlen.

60
justin

sie können es mit CLANG_ENABLE_OBJC_ARC = NO aus/einschalten, wenn Sie weniger Code schreiben müssen und die Speicherverwaltung einfacher ist. Nachteil ist, dass Sie alles kratzen müssen, was Sie über Speicherverwaltung gelernt haben :) Ich bevorzuge es, es auszuschalten.

1
RolandasR

Ich benutze Lion und xcode 4.3. Ich hatte das gleiche Problem.

Um das Problem zu beheben, habe ich "Build Settings-> Objective-C Automatic Reference Co" auf "No" gestellt.

Um zu sehen, dass es auf "Ja" gesetzt war, musste ich auch die Optionen "Alle" und "Ebenen" in der Symbolleiste aktivieren, die sich direkt unter der Symbolleiste "Build-Einstellungen" befindet.

Sobald diese Optionen aktiviert waren, konnte ich sehen, dass diese Option auf "Ja" gesetzt war. Es dauerte eine Weile, bis ich herausfand, dass die Standardeinstellung "Nein" war. Dies wurde angezeigt, bis ich die Option "Levels" aktiviert habe.

0
Michael Potter

Sie können ARC über "Bearbeiten-> Refaktor-> In Ziel-Arc konvertieren" aktivieren. Dadurch wird Ihr Code vollständig umgestaltet (alle Speicherverwaltungsaufrufe usw. werden entfernt). Es gibt keine inverse Operation. Stellen Sie daher sicher, dass Sie die Quellcodeverwaltung verwenden, wenn Sie darüber nachdenken. Dieser Beitrag zeigt Ihnen, wie Sie ihn für bestimmte Dateien deaktivieren können. Ich denke nicht, dass es zu viele Argumente dafür gibt, dass wir uns nicht darum kümmern, abgesehen davon, dass es weh tut, wenn all diese Anstrengungen in ein gutes Speichermanagement investiert werden, und dass wir aufhören müssen, an die Decke zu springen Jedes Mal, wenn wir init, new sehen, ohne entsprechende Freigabe/Autorelease kopieren (und das ist gewöhnungsbedürftig). Vielleicht könnte man argumentieren, dass die manuelle Speicherverwaltung unter Umständen zu einer spürbaren Verbesserung der Leistung/des Speicherbedarfs führt, wenn ich mich auch dafür interessieren würde.

0
jbat100