Konvertierung MRC nach ARC?

  • Konvertierung MRC nach ARC?

    Hallo Kollegen,

    ich habe hier ein größeres und schon etwas in die Jahre gekommenes (ca. 10 Jahre Entwicklung, MacOS X, lauffähig ab 10.6.8 ) Projekt. Nach den letzten großen Renovierungsarbeiten ist jetzt die Migration auf ARC eine Option. Die Garbage-Collection hat uns nicht überzeugt, aber die Doku zu ARC liest sich ja ganz angenehm :)

    Hat hier unter den geneigten Lesern schon jemand mit einer Migration von MRC nach ARC Erfahrung sammeln können? Damit meine ich weniger die technischen Details (die stehen ja in der Doku) sondern mehr so grundlegende Erfahrungen, also sowas in der Richtung:

    * War prima, können wir empfehlen, weil...

    * War ein großer Mist weil...

    * Direkt nach dem Umstellung gab's viele Speicherlecks wegen Retain-Cycles, o.ä.

    * Auf alle Fälle aufpassen auf...

    in der Hoffnung auf rege Beteiligung

    schönen Gruß

    gandhi
  • Kann zwar nur von iOS sprechen, aber es ging hier auch ganz gut. Das ganze Projekt liess sich aber nicht auf ein mal konvertieren, da zu viele Probleme auftraten. Also bin ich Stück für Stück vorgegangen, und nach jedem Brocken ausführlich getestet. Genau hier treten häufig seltsame Phänomene auf, die man erst spät entdeckt. Jede Schweinerei aus der Vergangenheit zeigt sich dann ;)
  • Mal ganz dumm gefragt: Warum möchte man von MRC nach ARC migrieren? Ich schreibe bis jetzt noch mit MRC und bin ganz froh, dass es mich zwingt, mir Gedanken über Speichermanagement zu machen. Was gewinne ich mit ARC (ausser weniger Code-Zeilen)?

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • MyMattes schrieb:

    Mal ganz dumm gefragt: Warum möchte man von MRC nach ARC migrieren? Ich schreibe bis jetzt noch mit MRC und bin ganz froh, dass es mich zwingt, mir Gedanken über Speichermanagement zu machen. Was gewinne ich mit ARC (ausser weniger Code-Zeilen)?

    Zeitgewinn. Bequemlichkeit.
    Dieselben Gedanken musst du dir eh machen.

    Wie debugst du dein MRC? Du fragst den Static Analyzer. Der sagt dir 'Da hakt es!'. Du behebst das.

    ARC ist da die logische Schlussfolgerung: wenn der Static Analyzer eh alles besser weiß, dann soll er seinen Scheiß doch gefälligst selbst machen. ;)
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • Habe ein Projekt > 40000 Zeilen Code von MRC auf ARC umgestellt und bin immer wieder darüber gestolpert, dass es zirkelreferenzen geben kann, wenn man nicht wirklich aufpasst... vor allem NSWindowController und alle delegierten...

    lasse mir nun im debug immer alle deallocs per NSLog auch bestätigen...

    anfangs fand ich MRC sehr viel eifnacher, weil man bei ARC schon gut aufpassen muss, wo man Objekte verwendet und wie man sie daher genau definieren muss... udn da gibt es mehr als nur weak und strong...

    Aber am Ende bin ich schon froh, weil es halt an vielen Stellen doch weniger Code bedeutet...

    Volker
  • Hallo zusammen,

    erstmal Danke für die hilfreichen Hinweise.

    MyMattes schrieb:

    Mal ganz dumm gefragt: Warum möchte man von MRC nach ARC migrieren?


    Aus Bequemlichkeit und weil der Compiler weniger Fehler macht. Außerdem neigt Apple in letzter Zeit dazu nicht nur alte Zöpfe sondern auch mittelalte abzuschneiden. Und ich möchte nicht an dem Punkt sein, an dem eine Migration auf ARC in kurzer Zeit zwingend nötig ist, weil sonst irgendein ein tolles Feature oder eine neue OS-Version nicht mehr unterstützt werden kann. Trau, schau wem!

    Schade ist nur, das man bei der ARC-Umstellung zwar einzelne Teile herausnehmen kann, ich hätt's aber gerne umgekehrt: Also prinzipiell MRC und nur für von mir ausgewählte Teile der Anwendung ARC aktivieren. So könnten wir die verschiedenen Schichten der Anwendung im Sinne einer Risikominimierung nacheinander umstellen.

    schönen Gruß

    gandhi
  • gandhi schrieb:

    Schade ist nur, das man bei der ARC-Umstellung zwar einzelne Teile herausnehmen kann, ich hätt's aber gerne umgekehrt: Also prinzipiell MRC und nur für von mir ausgewählte Teile der Anwendung ARC aktivieren. So könnten wir die verschiedenen Schichten der Anwendung im Sinne einer Risikominimierung nacheinander umstellen.

    Das sollte auch möglich sein. Du kannst für einzelne Dateien einstellen, ob sie ARC oder MRC verwenden. Hier ist ein Beispiel, wie man das JSONKit in ein ARC-Projekt einbinden kann. Das ist zwar für iOS, sollte aber auch unter OSX funktionieren.
    „Meine Komplikation hatte eine Komplikation.“
  • macmoonshine schrieb:

    Du kannst für einzelne Dateien einstellen, ob sie ARC oder MRC verwenden.


    Ja, das ist mir bewusst. Aber eben leider nur ausschließen. D.h. ich muss ARC für das komplette Projekt aktivieren und dann einzelne Sourcen per Compiler-Flag ausschließen. Da sitze ich bei einigen hundert Sourcen schon mal ein, zwei Tage an dieser spannenden Aufgabe :cursing: (Wär was für einen Praktikanten ;) ).

    Andersherum würde es uns einen Haufen Arbeit sparen.

    schönen Gruß

    gandhi
  • volker schrieb:

    Habe ein Projekt > 40000 Zeilen Code von MRC auf ARC umgestellt und bin immer wieder darüber gestolpert, dass es zirkelreferenzen geben kann, wenn man nicht wirklich aufpasst... vor allem NSWindowController und alle delegierten...

    lasse mir nun im debug immer alle deallocs per NSLog auch bestätigen...

    anfangs fand ich MRC sehr viel eifnacher, weil man bei ARC schon gut aufpassen muss, wo man Objekte verwendet und wie man sie daher genau definieren muss... udn da gibt es mehr als nur weak und strong...

    Aber am Ende bin ich schon froh, weil es halt an vielen Stellen doch weniger Code bedeutet...

    Volker

    Ich behaupte mal dann rotzfrech, dass das daran lag, dass schon der MRC-Code nur zufällig funktionierte.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • MyMattes schrieb:

    Mal ganz dumm gefragt: Warum möchte man von MRC nach ARC migrieren? Ich schreibe bis jetzt noch mit MRC und bin ganz froh, dass es mich zwingt, mir Gedanken über Speichermanagement zu machen. Was gewinne ich mit ARC (ausser weniger Code-Zeilen)?

    Mattes

    Du musst dir keine Gedanken über Speichermanagement machen. (Genauer: Du musst dir deutlich weniger Gedanken über Speichermanagement machen.)
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • gritsch schrieb:

    ich hoffe mal dass apple uns nicht schon bald zu ARC "zwingt"...


    Ich dachte immer der Clou bei ARC wäre, dass alles kompatibel ist, also dass MRC Frameworks in einer ARC-App laufen und umgekehrt. Wobei es natürlich sein könnte, dass Apple Apps rejected die kein MRC verwenden.

    Ein Tipp:mikeash.com/pyblog/introducing-plweakcompatibility.html. Damit kannst du laut Autor auch weak in 10.6 verwenden. Ich weiß nur nicht, ob Apple das beim Einreichen der App rejected.
  • Hallo zusammen,

    ist zwar schon eine Weile her, aber vielleicht hilft's ja den einen oder anderen: Das Projekt wurde inzwischen auf ARC migriert. Das lief erstaunlich problemlos:

    * Nach dem ersten Refactoring gab es ca. 400 Issues die zu beheben waren. Die meistem (ca. 75%) konnten behoben werden durch leichte Code-Änderungen ohne die Kompatibilität zu MRC aufzugeben, also quasi im Vorbeigehen. Das waren z.b. solche Stellen an denen ein alloc/init in einer Zeile stand und das dazugehörige autorelease ein paar Zeilen weiter unten.

    * Nach diesem Schritt blieben ca. 120 Issues übrig. Ein Großteil davon betraf die Verwendung von CoreFoundation-Objekten. Die konnte man einfach durch den Einsatz der entsprechenden Casts (__bridge, __bridge_transfer und Co.) beheben.

    * Der Rest betraf Info-Dialoge, die sich selbst nach der Anzeige eine autorelease-Message geschickt haben. Die wurden dann auf einen Completion-Handler mit Blocks umgestellt.

    Also meine Empfehlung: :thumbsup:

    schönen Gruß

    gandhi