Frage zur Speicherverwaltung

M

Maximilian2010

Mitglied
Thread Starter
Dabei seit
07.09.2010
Beiträge
38
Reaktionspunkte
0
Hey zusammen,
ich habe ein Problem bei dem Speichermanagement und weiß nicht so genau wie ich das lösen kann...
Ich habe folgende Klassen:
objekt.h
Code:
struct sample_data{
	NSInteger		  id;
	NSString*		  name;
	NSMutableArray* list;
};
struct sample_data_list{
	NSInteger		list_id;
	NSString*		list_name;
	NSInteger		list_has_details;
	NSMutableArray* list_details;
};
-(void) read_sample_data : (NSMutableArray*) data;

objekt.m
Code:
-(void) read_sample_data : (NSMutableArray*) data{
	struct sample_data data_temp;
        struct sample_data_list data_list_temp;
	[data removeAllObjects];
	
//Struct aus Datenbank füllen
	const char* sql = "SELECT sample_id, name FROM sample_data";
	sqlite3_stmt *select;
	int resp = sqlite3_prepare(db_data, sql, -1, &select, NULL);
	if( resp == SQLITE_OK ){
		while(sqlite3_step(select) == SQLITE_ROW){
			data_temp.id		= sqlite3_column_int(select, 0);
			data_temp.name	= [NSString stringWithUTF8String:(char*)sqlite3_column_text(select, 1)];
			data_temp.list	= [[[NSMutableArray alloc] init] autorelease];
			
			//zweite Datenbankabfrage
			if( resp_1 == SQLITE_OK ){
				while(sqlite3_step(select_1) == SQLITE_ROW){
					...
					[data_temp.list addObject: [NSValue value:&data_list_temp withObjCType:@encode(struct sample_data_list)]];
				}
			}
			
			[data addObject: [NSValue value:&data_temp withObjCType:@encode(struct sample_data)]];
		}
	}
}

In meiner Main erzeuge ich dann ein Objekt der obigen Klasse:
Code:
        my_data = [objekt new];
	my_sample_data = [[NSMutableArray alloc]init];        //globale Variable & release in der dealloc
	[my_data read_sample_data : my_sample_data];

Wenn ich jetzt im Programmablauf auf die Unterarrays von my_sample_data zugreifen möchte, erhalte ich logischerweise einen EXC_BAD_ACCESS... wenn ich jetzt die autorelease rausstreiche sollte es ja eigentlich funktionieren oder? Aber wie gebe ich die dann am besten wieder frei? Muss ich dann in der dealloc mein my_sample_data in einer Schleife durchlaufen und alle releasen?
Vielen Dank

Edit: die NSStrings müsste ich dan auch retainen, ne?
 
Zuletzt bearbeitet:
Besonders das hier ist das Problem:

Code:
[data addObject: [NSValue value:&data_temp withObjCType:@encode(struct sample_data)]];

Eigentlich ist das alles so in Ordnung, aber Du mischst hier C Structs und Objekte. Das geht nicht gut, wenn man nicht aufpasst.

Das "@encode" verpackt Dir zwar Deine Strukts, hat aber keine Ahnung, was die Felder darin bedeutet. Das heisst, Deine list wird Autoreleased, und ist dann weg.

Wer hat Dir dieses "NSValue" beigebracht, und in welchem Zusammenhang? Ich empfehle Dir, aus ALLEN Deinen structs Objekte zu machen. Dann hast Du diese Probleme nicht.

Wenn Du bei den structs bleiben willst, dann musst Du die list selbst retainen und wieder freigeben. Das wird aber ein Spass....

Alex
 
mhh ok, dann muss ich mir das mal überlegen alles in Objekte umzuwandeln...
Ist am Ende sicherlich einfacher zu handhaben!
Danke!
Määx
 
Ja, ist es. Welchen Vorteil haben die structs?

Alex
 
Zurück
Oben Unten