Es gibt keinen Nachteil. Benutze es. Mach es heute. Es ist schneller als Ihr alter Code. Es ist sicherer als Ihr alter Code. Es ist einfacher als Ihr alter Code. Es ist keine Speicherbereinigung. Es hat keinen GC-Laufzeitaufwand. Die Compiler-Einfügungen behalten und geben sie an allen Stellen frei, die Sie sowieso haben sollten. Aber es ist schlauer als Sie und kann diejenigen optimieren, die nicht wirklich benötigt werden (genau wie es Schleifen abrollen, temporäre Variablen, Inline-Funktionen usw. eliminieren kann).
OK, jetzt erzähle ich Ihnen von den kleinen Nachteilen:
Wenn Sie ein langjähriger ObjC-Entwickler sind, werden Sie ungefähr eine Woche lang zucken, wenn Sie ARC-Code sehen. Sie werden sehr schnell darüber hinwegkommen.
Es gibt einige (sehr) kleine Komplikationen bei der Überbrückung zum Core Foundation-Code. Es gibt etwas mehr Komplikationen im Umgang mit allem, was ein id
als behandelt void*
. Dinge wie C-Arrays von id
können etwas mehr Nachdenken erfordern, um richtig zu machen. Ein ausgefallener Umgang mit ObjC va_args
kann ebenfalls Probleme verursachen. Die meisten Dinge, die Mathematik auf einem ObjC-Zeiger betreffen, sind schwieriger. Sie sollten auf keinen Fall viel davon haben.
Sie können kein id
in ein setzen struct
. Dies ist ziemlich selten, wird aber manchmal zum Packen von Daten verwendet.
Wenn Sie die korrekte KVC-Benennung nicht befolgt und ARC- und Nicht-ARC-Code gemischt haben, treten Speicherprobleme auf. ARC verwendet die KVC-Benennung, um Entscheidungen über die Speicherverwaltung zu treffen. Wenn es nur ARC-Code ist, spielt es keine Rolle, da es auf beiden Seiten das gleiche "Falsche" macht. Wenn es sich jedoch um gemischtes ARC / Nicht-ARC handelt, liegt eine Nichtübereinstimmung vor.
ARC verliert während der Auslösung von ObjC-Ausnahmen Speicher. Eine ObjC-Ausnahme sollte sehr nahe an der Beendigung Ihres Programms liegen. Wenn Sie eine erhebliche Anzahl von ObjC-Ausnahmen abfangen, verwenden Sie diese falsch. Dies kann mit behoben werden -fobjc-arc-exceptions
, führt jedoch zu den unten beschriebenen Strafen:
ARC verliert während der Auslösung von ObjC- oder C ++ - Ausnahmen im ObjC ++ - Code keinen Speicher, dies geht jedoch zu Lasten der Zeit- und Raumleistung. Dies ist ein weiterer Grund in einer langen Liste von Gründen, die Verwendung von ObjC ++ zu minimieren.
ARC funktioniert unter iPhoneOS 3 oder Mac OS X 10.5 oder früher überhaupt nicht. (Dies hindert mich daran, ARC in vielen Projekten zu verwenden.)
__weak
Zeiger funktionieren unter iOS 4 oder Mac OS X 10.6 nicht richtig, was schade ist, aber ziemlich einfach zu umgehen ist. __weak
Zeiger sind großartig, aber sie sind nicht das Hauptverkaufsargument von ARC.
Für mehr als 95% des Codes ist ARC brillant und es gibt überhaupt keinen Grund, dies zu vermeiden (vorausgesetzt, Sie können mit den Einschränkungen der Betriebssystemversion umgehen). Für Nicht-ARC-Code können Sie übergeben-fno-objc-arc
Datei für Datei weitergeben. Xcode macht dies leider viel schwieriger als es in der Praxis sein sollte. Sie sollten wahrscheinlich Nicht-ARC-Code in ein separates xcodeproj verschieben, um dies zu vereinfachen.
Wechseln Sie abschließend so schnell wie möglich zu ARC und schauen Sie niemals zurück.
BEARBEITEN
Ich habe einige Kommentare im Sinne von "Die Verwendung von ARC ist kein Ersatz für die Kenntnis der Cocoa-Speicherverwaltungsregeln" gesehen. Dies ist meistens wahr, aber es ist wichtig zu verstehen, warum und warum nicht. Erstens, wenn Ihr gesamter Code ARC verwendet und Sie die drei magischen Wörter verletzen überall gegen den , haben Sie immer noch keine Probleme. Schockierend zu sagen, aber los geht's. ARC behält möglicherweise einige Dinge bei, die Sie nicht beibehalten möchten, aber es gibt sie auch frei, sodass es keine Rolle spielt. Wenn ich heute eine neue Klasse in Cocoa unterrichten würde, würde ich wahrscheinlich nicht mehr als fünf Minuten mit den eigentlichen Speicherverwaltungsregeln verbringen, und ich würde wahrscheinlich nur die Speicherverwaltungs-Namensregeln erwähnen, während ich über die KVC-Benennung diskutiere. Mit ARC,
Aber Sie könnten kein anständiger fortgeschrittener Programmierer werden. Sie müssen die Regeln kennen, um eine korrekte Verbindung mit Core Foundation herzustellen, und jeder fortgeschrittene Programmierer muss sich irgendwann mit CF befassen. Und Sie müssen die Regeln für gemischten ARC / MRC-Code kennen. Und Sie müssen die Regeln kennen, wenn Sie anfangen, mit void*
Zeigern herumzuspielen id
(die Sie weiterhin benötigen, um KVO korrekt auszuführen). Und Blöcke ... nun, Blockspeicherverwaltung ist einfach komisch.
Mein Punkt ist also, dass die zugrunde liegende Speicherverwaltung immer noch wichtig ist, aber wo ich früher viel Zeit damit verbracht habe, die Regeln für neue Programmierer festzulegen und neu zu formulieren, wird ARC mit ARC zu einem fortgeschritteneren Thema. Ich möchte lieber neue Entwickler dazu bringen, in Objektgraphen zu denken, als ihre Köpfe mit den zugrunde liegenden Aufrufen zu füllen objc_retain()
.