NSString und release...

  • NSString und release...

    Ich wurde letztens eine eigentlich einfache Frage bekommen, auf die ich aber keine Antwort finden konnte.

    Auf diese drei üblichen Arten richtet man sich z.B. ein Stringobjekt ein.

    Quellcode

    1. NSString * myString1 = [[NSString alloc] initWithString:@"Hallo 1"];
    2. NSString * myString2 = [NSString stringWithString:@"Hallo 2"];
    3. NSString * myString3 = @"Hallo 3";

    Bei Nr.1 schickt man eine "release"-Message, wenn man es nicht mehr braucht.
    Bei Nr.2 wurde ein Convience Contructor verwendet, und ist somit autoreleased.

    Die Frage:
    Was ist aber mit Nr.3? Braucht das ein release, oder ist das autoreleased?
    Toller Beitrag. :thumbup:
  • RE: NSString und release...

    Hm, eigentlich verhält sich 1 und 2 genau umgekehrt, d.h. myString1 ist autoreleased und myString2 musst Du selbst ein release schicken oder es mit autorelease in den ARP stellen.

    myString3 ist "quasi" static. Hier sind retain und release nicht von Bedeutung, d.h. das Objekt wird erst zerstört, wenn das Programm beendet wird.
  • RE: NSString und release...

    Original von Deckard
    Ich wurde letztens eine eigentlich einfache Frage bekommen, auf die ich aber keine Antwort finden konnte.


    Da steht die Antwort:

    "This is the fundamental rule:

    You take ownership of an object if you create it using a method whose name begins with “alloc” or “new” or contains “copy” (for example, alloc, newObject, or mutableCopy), or if you send it a retain message. You are responsible for relinquishing ownership of objects you own using release or autorelease. Any other time you receive an object, you must not release it."
    developer.apple.com/documentat…emoryManagementRules.html

    Alex

    EDIT: Du hast offenbar genau verwechselt, was ein convenience allocator ist.
    The only thing that really worried me was the ether.
  • RE: NSString und release...

    Hm, eigentlich verhält sich 1 und 2 genau umgekehrt, d.h. myString1 ist autoreleased und myString2 musst Du selbst ein release schicken oder es mit autorelease in den ARP stellen.

    Äh... Natürlich. Meinte ich ja. - Korrigiere ich mal schnell,...

    myString3 ist "quasi" static. Hier sind retain und release nicht von Bedeutung, d.h. das Objekt wird erst zerstört, wenn das Programm beendet wird.

    Das retain und release keinerlei Wirkung haben, habe ich auch schon bemerkt. Und der Retain-Counter steht immer bei 2147483647.
    Toller Beitrag. :thumbup:
  • Was ist aber mit Nr.3? Braucht das ein release, oder ist das autoreleased?


    Du brauchst kein release.

    Stell dir vor du müsstest bei jedem [receiver valueForKey:@"aKeyString" ] Konstrukt von @"aKeyString" verantwortlich sein? Dann möchte ich aber nicht mehr in obj-c programmieren :)
    Coding is poetry. Cocoa the inspiration (Meine Posts bitte nicht mit IE betrachten. Ich tue das auch nicht.)
  • Ich habe bisher alle Stringobjekte, die ich mit = @"Text" zugewiesen habe, immer wie Macros oder Konstanten betrachtet. Und mir daher nie Frage gestellt, ob die vielleicht mal released werden sollten.

    Anderseits habe ich seit gestern plötzlich Zweifel, schliesslich kann man denen auch Nachrichten schicken und deren Methoden aufrufen. Warum ist das so? Was sind das eigentlich für Objekte? Und wem gehören die?
    Toller Beitrag. :thumbup:
  • Original von below
    Die sind statisch. Werden beim Programmstart erzeugt, beim beenden des Programms zerstört.

    Alex

    Da komme ich etwas zu spät …

    In der Tat: String-Kosntanten-Objekte sind Sache des Compilers. Einfach verwenden, zur Kenntnis nehmen und sich nicht drum kümmern.

    Eine ganz ähnliche Problematik stellt sich bei Klassenobjekten. Wie wird man die eigentlich wieder los? Einfach verwenden, zur Kenntnis nehmen und sich nicht drum kümmern.

    BTW: Das ist kein @2, @2.45 usw. gibt, hat mich schon immer geärgert. ;)
    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"?