ObjC: Reference Counting und NSAutoreleasePool doku

D

DickUndDa

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!
 
http://macentwicklerwelt.net/doku.php?id=wiki:speicherverwaltung

Und wenn ich ein bischen Werbung für die Konkurrenz machen darf:

http://www.cocoading.de/Buch/cocoading-Buch.html

Auf Englisch natürlich Werbung für die eigenen Leute:
http://bignerdranch.com/products/cocoa1.shtml

Alex

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;
}
 
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
 
Zurück
Oben Unten