Benutzerdefinierte Suche

ObjC: Reference Counting und NSAutoreleasePool doku

  1. DickUndDa

    DickUndDa Thread Starter

    Hi miteinand,

    Ich bin gerade dabei "Programming in Objective-C" von Herr Kochan durchzuackern. Dabei bin ich beim oben genannten Thema auf eine harte Nuss gestoßen.

    Ich denke ich habe die Grundzüge verstanden aber so richtig gecheckt habe ich es noch nicht. Nun bin ich mir nicht sicher ob es evtl. ein bisschen an meinem Englisch liegt (beim Rest des Buches hatte ich da eigentlich kaum Probleme).

    Deshalb meine Frage: Kennt jemand zu dem Thema gute Papers? Möglichst auf Deutsch - aber auch auf Englisch kann eine andere Erklärweise nicht schaden.

    Danke!
     
    DickUndDa, 31.03.2007
  2. below

    belowMacUser Mitglied

    Mitglied seit:
    15.03.2004
    Beiträge:
    13.289
    Zustimmungen:
    1.086
    below, 31.03.2007
  3. DickUndDa

    DickUndDa Thread Starter

    Optimal! Danke Alex.

    Der Hillegass steht hier schon im Regal das wird das nächste "Studienobjekt" ;)

    Ich werd mir das gleich mal anschauen. Bis dahin noch eine wahrsch. blöde Frage:

    Warum bekomme ich hier bei [pool release] einen Laufzeitfehler? (ich bin da nur am rumprobieren - ist als sicherlich unschöner code *g*).

    Code:
    #import <stdio.h>
    #import <Foundation/NSObject.h>
    #import <Foundation/NSAutoreleasePool.h>
    #import <Foundation/NSDictionary.h>
    #import <Foundation/NSString.h>
    
    int main(int argc, char *argv[])
    {
    	NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    	NSMutableDictionary *dict = [NSMutableDictionary dictionary];
    	NSMutableString *tadaTest = [[NSMutableString alloc] init];	
    	
    	//Store some entries in die dict
    	[dict setObject: @"test String Object" forKey:@"test"];
    	printf("retainCount before setString %d\n", [tadaTest retainCount]);
    	[tadaTest setString:@"tada Test String"];
    	printf("retainCount after setString %d\n", [tadaTest retainCount]);
    	[dict setObject: tadaTest forKey: @"Arsch"];
    	printf("retainCount after add it to dict %d\n", [tadaTest retainCount]);
    	[dict setObject: @"HansHerrbertArsch" forKey: @"Hans"];
    	
    	[dict release];
    	printf("retainCount after dict release: %d\n", [tadaTest retainCount]);
    	[pool release];
    	printf("retainCount after pool release: %d\n", [tadaTest retainCount]);
    	return 0;
    }
    
     
    DickUndDa, 31.03.2007
  4. below

    belowMacUser Mitglied

    Mitglied seit:
    15.03.2004
    Beiträge:
    13.289
    Zustimmungen:
    1.086
    Objekte, die nicht mit einer Methode die "alloc", "create", "copy" oder "new" enthält erzeugtwurden sind autoreleased.

    NSMutableDictionary *dict = [NSMutableDictionary dictionary];

    Wurde nicht durch "alloc", "create", "copy" oder "new" erzeugt, kommt also in den Autorelease Pool (ARP).

    [dict release];

    Gibt das dict jetzt wieder frei. So weit, so gut. Aber durch

    [pool release];

    werden alle Objekte, die im ARP sind freigegeben. Auch dict -- dass Du vorher schon ein release gemacht hast, woher soll der ARP das wissen?
    Also versucht er, das bereits freigegebene Objekt wieder freizugeben und : "BOOM smashed the boy on the hard concrete"

    Lösung des Problems: Mach nur ein Release, wenn das Object mit den o.g. Methoden erzeugt wurde, oder Du ihm ein "retain" geschickt hast. Sonst ist das Release unbalanciert und potentiell (in Deinem Fall auch aktuell) gefährtlich.

    Klarer?

    Alex
     
    below, 31.03.2007
Die Seite wird geladen...
Ähnliche Themen - ObjC Reference Counting
  1. VwieVendetta
    Antworten:
    22
    Aufrufe:
    1.570
    VwieVendetta
    24.10.2010
  2. sue!
    Antworten:
    7
    Aufrufe:
    882
  3. ralan
    Antworten:
    1
    Aufrufe:
    804
  4. dpauw
    Antworten:
    53
    Aufrufe:
    3.904
  5. breiti
    Antworten:
    8
    Aufrufe:
    728