In MRC waren Sie dafür verantwortlich, den Überblick zu behalten und dafür zu sorgen, dass alle Referenzen von Objekten ordnungsgemäß inkrementiert, dekrementiert und deallokiert wurden. In Obj-C gibt es im Grunde eine Reihe von Regeln, die verhindern sollen, dass es zu Speicherlecks oder "Dangling Pointers" kommt, und es war ein beträchtlicher Aufwand, dafür zu sorgen, dass alles einwandfrei funktioniert, und das hätte man auch automatisieren können, wie es bei anderen Sprachen der Fall war.
Das ist der Moment, in dem ARC ins Spiel kommt.
ARC kam als einschneidende Alternative zu der Art und Weise, wie die Dinge mit MRC funktionierten. Mit ARC werden Instanzen freigegeben, wenn es keine starke Referenz auf sie gibt, und jede Instanz verfolgt die Anzahl der starken und schwachen/unbesetzten Referenzen auf sich selbst. Obwohl es wie ein ähnliches Verhalten aussehen mag, ist der Aufwand in beiden Fällen sehr unterschiedlich. In MRC musste man alles im Auge behalten, während man in ARC nur Retain-Zyklen vermeiden sollte.
Einige Unterschiede zwischen ARC und Garbage Collector sind:
- Der Garbage Collector ist Teil der Laufzeitstruktur. In ARC übernimmt der Swift-Compiler die Codebereinigung und das Einfügen der Referenzverfolgung in Ihr App-Bundle.
- Der Garbage Collector fordert den Speicher nicht zurück, sobald die Instanz ihre Referenzen verliert, sondern ARC.
- Wenn einige Objekte Zyklus (oder Graph) hat Verweise auf sich selbst, sondern sind nicht zugänglich durch die Root-Knoten, GC kann das Loch Graph zu reinigen, während in ARC sie nie deallocated bekommen würde, weil sie starke Verweise auf sie andere (behalten Zyklus) zu halten.
Wenn Sie weitere Informationen suchen, finde ich diesen Artikel sehr hilfreich: https://swift007blog.wordpress.com/2017/01/14/what-is-arc-in-ios/