Freigabe von Propertyobjekten

  • Freigabe von Propertyobjekten

    Hallo Leute nur mal ne kurze Frage und zwar

    wenn ich ein Objekt mit @property erstelle und es dann mit @syntesize implementiere wie release ich das Objekt wieder?

    Mit

    Quellcode

    1. [self.objekt release];


    oder geht es auch mit

    Quellcode

    1. self.objekt = nil;



    Danke für die Hilfe
  • OS X NoobCoder schrieb:

    kannst du mir das vielleicht noch bisschen erläutern wieso. Wäre echt ne Sache aber trotzdem schonmal danke :thumbup:

    Wenn Du es über die erste Variante freigibst, erzeugst Du einen Dangling Pointer. Wenn es sich um eine Property vom Typ strong, retain oder copy handelt, bekommt das Objekt hinter dem Pointer bei einer Zuweisung noch ein Release geschickt und das geht früher oder später in die Hose.
    „Meine Komplikation hatte eine Komplikation.“
  • OS X NoobCoder schrieb:

    Nur kurz was ist ein Dangling Pointer und das heisst wenn ich ein property mit retain erstelle dann geben ich es immer mit self dem Namen des Objekts und = Nil wieder frei hab ich richtig verstanden ?

    Nein, nicht immer. Insbesondere gibt es eine nicht unbedeutende Zahl an Menschen, die im -dealloc ein [iVarOfObject release] sehen wollen. Außerdem steht das natürlich so im Setter (den du allerdings mutmaßlich synthetisiert hast.)

    Eine Alternative:
    Objective-C Automatic Reference Counting: YES

    Ein Dangling-Pointer ist eine Objektreferenz (in diesem Falle), die auf etwas zeigt, wo kein Objekt mehr ist.
    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"?
  • OS X NoobCoder schrieb:

    Was heisst das dann genau wie gebe ich die Objekte dann frei? Oder gibt's da ne Regel an die ich mich halten kann oder ähnliches?

    Zahlreiche, die in Büchern und Apple-Tutorials erläutert werden.
    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"?
  • OS X NoobCoder schrieb:

    Kannst du mir ne Seite zum Nachlesen empfehlen weil in meinem buch steht davon leider gar sondern nur allgemein zum Speichermanagement

    Welches Buch?

    Ansonsten einfach nach "Memory Management" suchen.
    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:

    es geht NUR mit self.objekt = nil bzw [self setObjekt:nil];

    Das verstehe ich nicht so ganz. Ich habe bisher Properties (wie auch andere Objekte) mit

    Quellcode

    1. [object release], object = nil;

    frei gegeben (bzw. mit [self object] für Properties). Das Setzen des Pointers auf nil mache ich eigentlich nur, um bei irrtümlichen Senden von Nachrichten an das Objekt keine Exceptions zu bekommen. Idealerweise sollte dies nur für den Release-Build erfolgen, damit ich vorher deratige Patzer finde, aber dafür habe ich noch keine vernünftige Idee. Wenn ich mir jetzt den entsprechenden Setter vorstelle, sähe der etwas so aus:

    Quellcode

    1. (id)setObject:(id)newObject:
    2. {
    3. [newObject retain];
    4. [object release];
    5. object = newObject;
    6. }

    Dann entspricht ein [self setObject:nil] aber doch genau meinem Code ... Habe ich was übersehen oder Dich falsch verstanden?

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • klar, im dealloc kannst du auch die ivar verwenden (falls vorhanden, da synthetisiert).

    ich meinte mit meiner aussage eben dass er den rückgabewert eines getters nicht releasen soll/darf!

    >Das Setzen des Pointers auf nil mache ich eigentlich nur, um bei irrtümlichen Senden von Nachrichten an das Objekt keine Exceptions zu bekommen.

    ???
  • gritsch schrieb:

    >Das Setzen des Pointers auf nil mache ich eigentlich nur, um bei irrtümlichen Senden von Nachrichten an das Objekt keine Exceptions zu bekommen.

    ???

    Früher habe ich nur released. Wenn ich dann aus Schusseligkeit dem Objekt später noch eine Nachricht geschickt hätte, gäb es aufgrund des dangling pointers eine Exception. Ist der Pointer nil, passiert dies nicht, da man ruhig Nachrichten an nil schicken darf. Während der Entwicklungsphase ist mir die Exception willkommen, um einen derartigen Fehler zu finden, aber im späteren Release im Sinne einer robusten Anwendung nicht. Besser ist natürlich, diesen Fall gar nicht erst auftreten zu lassen ... ;)

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • So hab jetzt nochmal nachgelesen hier steht:

    Eigene Objekte müssen mit release oder autorelease freigegeben werden

    Definition von eigenen Objekten:

    Die (Speicher-) Verantwortung für ein Objekt wurde durch Senden der retain-Nachricht übernommen.

    das heisst dann für mich, dass alle Properties welche mit @property (nonatomic, retain) erstellt werden,
    hit release freigegeben warden müssen.

    Is das so richtig
  • MyMattes schrieb:

    gritsch schrieb:

    >Das Setzen des Pointers auf nil mache ich eigentlich nur, um bei irrtümlichen Senden von Nachrichten an das Objekt keine Exceptions zu bekommen.

    ???

    Früher habe ich nur released. Wenn ich dann aus Schusseligkeit dem Objekt später noch eine Nachricht geschickt hätte, gäb es aufgrund des dangling pointers eine Exception. Ist der Pointer nil, passiert dies nicht, da man ruhig Nachrichten an nil schicken darf. Während der Entwicklungsphase ist mir die Exception willkommen, um einen derartigen Fehler zu finden, aber im späteren Release im Sinne einer robusten Anwendung nicht. Besser ist natürlich, diesen Fall gar nicht erst auftreten zu lassen ... ;)

    Mattes


    ah verdammt, ich hab das "keine" überlesen in der hektik (deshalb auch kein ordentlicher quote)
  • OS X NoobCoder schrieb:

    So hab jetzt nochmal nachgelesen hier steht:

    Eigene Objekte müssen mit release oder autorelease freigegeben werden

    Definition von eigenen Objekten:

    Die (Speicher-) Verantwortung für ein Objekt wurde durch Senden der retain-Nachricht übernommen.

    das heisst dann für mich, dass alle Properties welche mit @property (nonatomic, retain) erstellt werden,
    hit release freigegeben warden müssen.

    Is das so richtig


    NEIN! entweder im dealloc (und NUR dort) ein release auf die iva (nicht auf das resultat des getters) oder einfach mittels setter nil setzen (egal von wo)