Wo ist der unterschied

  • Wo ist der unterschied

    Quellcode

    1. - (void)setmyComment:(NSString *)was {
    2. [was retain];
    3. [myComment release];
    4. myComment=was;
    5. }
    6. - (void)setmyComment:(NSString *)was {
    7. [myComment autorelease];
    8. myComment = [was copy];
    9. }


    Wo ist bei den beiden der unterschied. das Obere funktioniert nur auf NSTextFields, das untere auf NSTextFiels und auf NSTextViews!

    Grufl Sven
    :wq! /dev/null
  • RE: Wo ist der unterschied

    mit dem copy und retain ist das so eine sache... wenn du dir sicher sein kannst, dafl das objekt, das du behalten mˆchtest, nicht in der quelle des objekts ge‰ndert wird (und du nur sagen willst "interessiert mich auch noch"), dann ist das retain prima.
    du solltest dir aber auch sicher sein, dafl sich nicht beispielsweise die quelle eventuell darauf verl‰flt, dafl nicht _du_ das objekt ver‰nderst.

    wenn du aber nicht weiflt, wo das objekt herkommt und du speziell nicht weiflt, ob die quelle das objekt eventuell ‰ndert, solltest du es sicherheitshalber kopieren. damit wird dann deine eigene kopie erzeugt, die du behalten oder ‰ndern kannst wie du mˆchtest.

    ist das einigermaflen klar geworden?
    if (!exit(-1)) fprintf(stderr, "exit call failed. Program will continue\n");
  • RE: Wo ist der unterschied

    Original von Stalkingwolf

    Quellcode

    1. - (void)setmyComment:(NSString *)was {
    2. [was retain];
    3. [myComment release];
    4. myComment=was;
    5. }
    6. - (void)setmyComment:(NSString *)was {
    7. [myComment autorelease];
    8. myComment = [was copy];
    9. }


    Grufl Sven


    Beide haben den Nachteil, dafl f¸r einen kurzen Moment, myComment ung¸ltig wird. Findet dummerweise in einem anderen Thread ein Zugriff auf diese Variable statt, wird das Programm abst¸rzen.

    Siehe auch:
    stepwise.com/Articles/Technical/MemoryManagement.html

    Generell:

    autorelease braucht man nur, wenn man sich eine Klasse macht, die etwas an ANDERE zur¸ckliefern muss. Dann taucht n‰mlich das Problem auf, dafl dieser Routine nicht weifl wie LANGE das Object noch genutzt wird. Wenn man SOFORT ein release machen w¸rde, dann w¸rde man ein ung¸ltiges Object zur¸ck liefern, wenn ein gar nix macht, dann weifl der Aufrufende nicht, was ER machen soll (retain oder nicht). Deswegen autorelease (der Retaincount ist 0, aber das Object ist (noch) g¸ltig.

    Der Retaincount ist also schon auf 0 und wenn derjenige das Object nicht haben will (kein retain macht) dann wird es bei der n‰chsten Garbargecollection wegger‰umt (wenn Programme irgendwann einfach abst¸rzen, dann ist EIN h‰ufiger Grund, dafl man ein Object benutzt, welches autoreleased war, aber man selbst nicht retained hat. Dies Objekt verschwindet dann und der n‰chste Zugriff darauf, tˆtet das Programm...)
    Es gibt genau 10 Sorten von Menschen.
    Die eine kennt das binaere Zahlensystem, die andere nicht.
  • RE: Wo ist der unterschied

    Original von mac_held
    Deswegen autorelease (der Retaincount ist 0, aber das Object ist (noch) g¸ltig.


    autorelease ver‰ndert den retain count nicht, sondern f¸gt das Objekt dem aktuellen Autoreleasepool hinzu. Wenn der Autoreleasepool released wird, bekommen alle Objekte im Pool eine release message geschickt. Wird dann der retain count 0, wird der Speicher des Objektes wieder freigegeben.

    Michael
  • aha, daf¸r ist der autorealese Pool und das autorelease.

    Unter Delphi musste ich mich mit dem ganzen kram gar nicht besch‰ftigen. Nur wenn ich komplett neue Objekte erstellt habe. muste ich diese wieder freigeben. Wobei das auf selbe hinnaus kommt.
    Glaub so langsam schimmert es :)

    Grufl Sven
    :wq! /dev/null