Gargabe Collector und retain

  • Gargabe Collector und retain

    Hallo,
    da ich an einer Cocoa-Applikation für Mac OS arbeite, habe ich mir gedacht, ich kann den Vorzug des Garbage Collectors benutzen und muss mich dann nicht um das Memory Management kümmern. Leider bin ich jetzt doch auf ein Problem gestoßen: Ich hatte immer mal wieder Programmabstürze und habe mich gefragt, woran das liegen könnte. Dabei habe ich nun herausgefunden, dass eine Methode auf eine Instanzvariable zugreift, welche aber auf einmal leer ist (was ich im Debugger sehen konnte). Der Garbage Collector hat also in der Zwischenzeit einfach meine Variable freigegeben/überschrieben/gelöscht (???). Testweise habe ich nun mal in der Methode, in der ich der Variable den benötigten Wert zuweise, ein retain gemacht. Nun läuft das Programm ohne Absturz und die Variable hat in der auslesenden Methode auch den richtigen Wert.
    Nun bin ich aber etwas verwirrt: Wieso kommt der blöde Garbage Collector auf die bescheuerte Idee, einfach meine Instanzvariablen freizugeben? Das macht er scheinbar nur, wenn ich die Variable eine Zeit lang nicht mehr anrühre. Im Apple-Guide zum Gargabe Collector steht daher auch, dass man dies mit retain verhindern kann. Woher soll ich nun aber wissen, wann es für den Garbage Collector Zeit ist, meine Variable freizugeben? Damit habe ich ja mehr oder weniger immer das Risiko, wenn zwischendurch mal etwas länger dauert. Kann ich vllt. die Instanzvariablen so einstellen, dass sie vom Garbage Collector nicht angerührt werden?
  • gritsch schrieb:

    Amin Negm-Awad schrieb:

    Ich glaube, dass der GC mausetot ist. So mausetot ist dann auch deine Frage. Benutze ARC, wenn dir 10.6 und 10.7 als Ziel-OS reichen.


    ich frag mich dann aber warum apple den überhaupt eingeführt hat. nur dass leute schlechten code schreiben können der manchmal läuft...!?


    ja, genau dafür - genau wie die dot-Notation...
    snafu
    :() { :|: &};:
    sometimes i dream in hex
    Obey gravity! Because its a law!
  • gritsch schrieb:

    Amin Negm-Awad schrieb:

    Ich glaube, dass der GC mausetot ist. So mausetot ist dann auch deine Frage. Benutze ARC, wenn dir 10.6 und 10.7 als Ziel-OS reichen.


    ich frag mich dann aber warum apple den überhaupt eingeführt hat. nur dass leute schlechten code schreiben können der manchmal läuft...!?

    na, ja, eine unmerkliche Garbage-Collection ist ja nichts schlechtes. Nur gibt es keine unmerkliche Garbage-Collection.

    Ich weiß noch, wie ich beim Tech-Talk in HH(?) als einziger die Hand hoch gehalten habe, als irgendein Dozent den fehlenden -dealloc gezeigt hat und fragte, ob man sich den zurückwünscht. Der hat dann noch einen lustigen Spruch über mich herausgelassen. Na, ja, vielleicht treffe ich ihn ja mal im Park – nachts – ohne Beleuchtung – mit Basey – oder so.

    Ich hatte hier damals schon gesagt, dass mir Smart-Pointer besser gefallen hätten. Apple hat das offenkundig gelesen.

    Bei mir verschwindet GC aus der nächsten Auflage. mRC werde ich kürzen. ARC regelt und felst.
    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"?
  • chartus schrieb:

    gritsch schrieb:

    Amin Negm-Awad schrieb:

    Ich glaube, dass der GC mausetot ist. So mausetot ist dann auch deine Frage. Benutze ARC, wenn dir 10.6 und 10.7 als Ziel-OS reichen.


    ich frag mich dann aber warum apple den überhaupt eingeführt hat. nur dass leute schlechten code schreiben können der manchmal läuft...!?


    ja, genau dafür - genau wie die dot-Notation...

    Die benutze ich sehr gerne und verstehe nicht, wo das Problem liegen soll.
    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"?
  • Amin Negm-Awad schrieb:

    chartus schrieb:

    gritsch schrieb:

    Amin Negm-Awad schrieb:

    Ich glaube, dass der GC mausetot ist. So mausetot ist dann auch deine Frage. Benutze ARC, wenn dir 10.6 und 10.7 als Ziel-OS reichen.


    ich frag mich dann aber warum apple den überhaupt eingeführt hat. nur dass leute schlechten code schreiben können der manchmal läuft...!?


    ja, genau dafür - genau wie die dot-Notation...

    Die benutze ich sehr gerne und verstehe nicht, wo das Problem liegen soll.


    weil ich nie weis ob ich auf strukturen oder c++-objekte zugreife ;)
  • Oh man... ich musste gerade mit Entsetzen feststellen, dass der Garbage Collector gar nicht eingestellt war. Ich habe das nun mal gemacht, den Retain-Code entfernt und seltsamerweise funktioniert die ganze Geschichte nun tadellos. Jetzt bin ich verwirrt...
    Gibt es irgendwo eine gute Seite, wo das Memory Management + GC + ARC irgendwie vernünftig erklärt wird? (Bzw. @Amin, wann kommt deine Neuauflage raus? ;))
  • Lupurus schrieb:

    Oh man... ich musste gerade mit Entsetzen feststellen, dass der Garbage Collector gar nicht eingestellt war.

    Ehrlich: Ich habe es mir fast gedacht.

    Lupurus schrieb:

    Ich habe das nun mal gemacht, den Retain-Code entfernt und seltsamerweise funktioniert die ganze Geschichte nun tadellos. Jetzt bin ich verwirrt...
    Gibt es irgendwo eine gute Seite, wo das Memory Management + GC + ARC irgendwie vernünftig erklärt wird?

    WWDC-Session, LLVM-Seite und mutmaßlich Xcode-Doku. Aller mir bekannten Erläuterungen kranken daran, dass sie die Problemfälle in den Vordergrund stellen. Dabei gibt es erst einmal nur zwei wichtige Regeln:

    1. Vergiss retain, release, autorelease, dealloc. Vergiss es einfach. Jetzt. Trinke notfalls Vodka.

    2. Um Retainzyklen aufzubrechen verwende weak anstelle von assign. (Ach, ja, verwende statt weak dieses nonsafe_jedöns, falls du das gute alte Meine-Applikation-crasht-wegen-eines-dangling-Pointers-Gehühl behalten willst. Irgendwie war die Beziehung zu mRC janicht perfekt, hat aber doch Spaß gemacht. Und der Sex war echt super.)


    Lupurus schrieb:

    (Bzw. @Amin, wann kommt deine Neuauflage raus? ;))

    "Demnächst" beschreibt es am besten.
    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:

    Amin Negm-Awad schrieb:

    chartus schrieb:

    gritsch schrieb:

    Amin Negm-Awad schrieb:

    Ich glaube, dass der GC mausetot ist. So mausetot ist dann auch deine Frage. Benutze ARC, wenn dir 10.6 und 10.7 als Ziel-OS reichen.


    ich frag mich dann aber warum apple den überhaupt eingeführt hat. nur dass leute schlechten code schreiben können der manchmal läuft...!?


    ja, genau dafür - genau wie die dot-Notation...

    Die benutze ich sehr gerne und verstehe nicht, wo das Problem liegen soll.


    weil ich nie weis ob ich auf strukturen oder c++-objekte zugreife ;)

    Wenn du nicht einmal weißt, ob du auf eine Struktur zugreifst, wie weißt du dann, welche Komponenten diese Struktur hat, die du nicht kennst? Proberst du so lange Buchstabenkombinationen aus, bis der Compiler nicht mehr meckert?

    Was ist übrigens dieses C++? Das soll Objekte haben? Und die können Dot-Notation? Scheint mir ja ein ziemlich verwechslungsefährliches Spiel zu sein, dieses C++.
    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"?
  • Amin Negm-Awad schrieb:

    Ehrlich: Ich habe es mir fast gedacht.

    Aber warum? Wenn der GC ausgestellt ist, wieso kann ich dann irgendwann nicht mehr auf meine Variable zugreifen? Wer pfuscht da herum?

    Amin Negm-Awad schrieb:

    Dabei gibt es erst einmal nur zwei wichtige Regeln:

    1. Vergiss retain, release, autorelease, dealloc. Vergiss es einfach. Jetzt. Trinke notfalls Vodka.

    ARC gibt es doch erst ab XCode 4.2, oder habe ich mich da falsch informiert? Also jetzt noch mit dem GC arbeiten oder den Memory selbst managen und den Wodka solange stehen lassen? ;)
  • Lupurus schrieb:

    Amin Negm-Awad schrieb:

    Ehrlich: Ich habe es mir fast gedacht.

    Aber warum? Wenn der GC ausgestellt ist, wieso kann ich dann irgendwann nicht mehr auf meine Variable zugreifen? Wer pfuscht da herum?

    Niemand. Da du kein retain machst, wird das Objekt entsorgt. So funktioniert mRC.

    Lupurus schrieb:

    Amin Negm-Awad schrieb:

    Dabei gibt es erst einmal nur zwei wichtige Regeln:

    1. Vergiss retain, release, autorelease, dealloc. Vergiss es einfach. Jetzt. Trinke notfalls Vodka.

    ARC gibt es doch erst ab XCode 4.2, oder habe ich mich da falsch informiert? Also jetzt noch mit dem GC arbeiten oder den Memory selbst managen und den Wodka solange stehen lassen? ;)

    Also, genau genommen hängt das vom verwendeten Compiler ab. Der ist jetzt bei 2.9. Wann das genau eingeführt wurde, weiß ich nicht. Dann hängt es von der Laufzeitumgebung des Zielsystems ab. Da verspricht Apple 10.6(.8) und 10.7. Deshalb hatte ich das ja oben geschrieben.

    Musst du für ältere Zielsysteme kompilieren? Oder hast du noch kein Xcode 4.2?
    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"?
  • Lupurus schrieb:

    Amin Negm-Awad schrieb:

    Ehrlich: Ich habe es mir fast gedacht.

    Aber warum? Wenn der GC ausgestellt ist, wieso kann ich dann irgendwann nicht mehr auf meine Variable zugreifen? Wer pfuscht da herum?

    Amin Negm-Awad schrieb:

    Dabei gibt es erst einmal nur zwei wichtige Regeln:

    1. Vergiss retain, release, autorelease, dealloc. Vergiss es einfach. Jetzt. Trinke notfalls Vodka.

    ARC gibt es doch erst ab XCode 4.2, oder habe ich mich da falsch informiert? Also jetzt noch mit dem GC arbeiten oder den Memory selbst managen und den Wodka solange stehen lassen? ;)


    der ARP "pfuscht" da rum. was auch korrekt so ist!

    ARC hängt nicht von Xcode ab sondern vom compiler.

    wenn du für ältere plattfomren programmierst dann lerne die korrekte speicherverwaltung!
  • Ich habe Lion und XCode 4.1 (da ich keinen Developer-Account habe, im App Store gibt es nur 4.1). Ich muss nicht für ältere Systeme kompilieren, also 10.6 und 10.7 ist gut.
    Das Memory Management werde ich mir trotzdem lieber _nochmal_ anschauen, alleine schon zum besseren Verständnis :)
  • Lupurus schrieb:

    Ich habe Lion und XCode 4.1 (da ich keinen Developer-Account habe, im App Store gibt es nur 4.1). Ich muss nicht für ältere Systeme kompilieren, also 10.6 und 10.7 ist gut.
    Das Memory Management werde ich mir trotzdem lieber _nochmal_ anschauen, alleine schon zum besseren Verständnis :)

    IIRC wird mit 4.1 alles mitgeliefert, was du für ARC benötigst. Schau es doch mal bei den Build-Optionen nach.
    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"?