• Wieder einmal haben uns unsere Apfeltalker tolle Fotos zur Abstimmung eingesandt. Welches ist Euer Favorit? Stimmt mit ab! Hier geht es zur Abstimmung --> Klick
  • Es ist bereits Apfeltalk-Tradition und wir möchten sie auch in diesem Jahr fortsetzen: Unser Apfeltalk-Weihnachtslogo-Wettbewerb hat begonnen! Gestaltet für uns das Weihnachtsbanner, das im Monat Dezember bis zum Weihnachtsfest unsere Webseite schmücken soll. Lasst Eurer Kreativität freien Lauf! Hier geht es zum Wettbewerb --> Klick

Trotz mehrfachem release kein Absturz?

bginner

Ingrid Marie
Registriert
13.12.09
Beiträge
266
Hallo zusammen,

gerade habe ich auf einer Tutorial-Seite einen Artikel über retain und release gelesen.
Dort steht, dass es zu einem Programmabsturz führt wenn man auch nur ein einziges release
zuviel aufruft (eigentlich klar).
Dann habe ich das ganze mal ausprobiert.

Code:
NSString *string1 = [[NSString alloc] initWithString:@"Hallo Welt"];
    [string1 release];
    [string1 release];
    [string1 release];
    NSLog(@"Retain-Count: %i", [string1 retainCount]);

    UILabel *myLabel = [[UILabel alloc] init];
    [myLabel setFrame:CGRectMake(10, 100, 300, 25)];
    [myLabel setText:[NSString stringWithFormat:@"Der String %@ hat die Länge %i",string1, [string1 length] ] ];
    [self.view addSubview:myLabel];
Hier werden gleich zwei releases zu viel ausgeführt und es funktioniert trotzdem.
Das verstehe ich nicht. Der Retain-Count zeigt immer "2147483647" an egal wann ich ihn aufrufe.
auch kann ich danach auf string1 erneut zugreifen und diesem auch Methoden schicken.
Habe es im Simulator und auf dem iPhone getestet und es läuft ohne abzustürzen.
Kann mir das mal bitte jemand erklären?
 
NSString nimmt eine Sonderstellung ein und funktioniert etwas anders.
Nimm mal ein anderes Objekt, zum Beispiel vom Typ UIView und release das zu oft.
 
Jep, NSStrings die über @"" erzeugt werden, bleiben im Speicher und werden wiederverwendet.

Verwendest du an mehreren Stellen NSString Objekte die z.B. mit @"Test" erzeugt werden, wird in Wirklichkeit nur ein NSString Objekt erzeugt auf das dann alle Pointer zeigen.

Es findet also eine Optimierung im Hintergrund statt, ähnlich dem Caching bei UIImage's imageNamed Methode.