ObjC: Reference Counting und NSAutoreleasePool doku

Diskutiere mit über: ObjC: Reference Counting und NSAutoreleasePool doku im Mac OS X Entwickler, Programmierer Forum

  1. DickUndDa

    DickUndDa Thread Starter Gast

    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!
     
  2. below

    below MacUser Mitglied

    Beiträge:
    13.882
    Zustimmungen:
    1.086
    Registriert seit:
    15.03.2004
  3. DickUndDa

    DickUndDa Thread Starter Gast

    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;
    }
    
     
  4. below

    below MacUser Mitglied

    Beiträge:
    13.882
    Zustimmungen:
    1.086
    Registriert seit:
    15.03.2004
    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
     
Die Seite wird geladen...
Ähnliche Themen - ObjC Reference Counting Forum Datum
Suche aktuelles Buch zu ObjC, Cocoa auf Xcode Mac OS X Entwickler, Programmierer 22.10.2010
Offline Reference Library ??? Mac OS X Entwickler, Programmierer 17.03.2006
ObjC MinGW GUI Mac OS X Entwickler, Programmierer 27.02.2006
GUI für OSX ohne ObjC? Mac OS X Entwickler, Programmierer 03.02.2006
ObjC Tortur(ials) für Einsteiger? Mac OS X Entwickler, Programmierer 09.09.2005

Diese Seite empfehlen

Benutzerdefinierte Suche