Wenn Du den GarbageCollector verwendest, reicht assign in der Property Deklarartion. Ich würde Dir dennoch raten, retain zu benutzen, die richtigen Accessoren bekommst Du ja in Deinem Fall mittels @synthesize.
									
									
									
								Zugriff auf Variable von überall
- 
			
- 
			hey,
 danke so weit für eure Hilfe. Ich hab mir ein neues Projekt erstellt und darin den Code übernommen, jetz geht's zumindest mal, Speicher schau ich mir wie gesagt noch an. Ich hab auch im nachhinein den Fehler im Interface Builder gefunden: Die App hatte keinen delegate mehr, der ist wohl irgendwie abhanden gekommen... Daher war auch [myDelegate gruppe] immer null
- 
			ein weiteres Problem: ich hab in einem Array Mannschaften gespeichert. In einem extra Sheet will ich Mannschaften in einer Tabelle anzeigen. Dazu sind da Funktionen zum hinzufügen, löschen und um die bestehenden bearbeiten zu können (Name etc. in einem Textfeld; die Funktionen gehen schon). In dem Sheet hab ich 2 Buttons OK und Abbrechen. Bei OK soll das geänderte gespeichert werden, ansonsten verworfen.
 Ich hab mir das jetzt so gedacht und auch probiert: Beim Öffnen des Sheets kopier ich mir das Array in ein neues, mit dem ich dann arbeite:Alles anzeigenQuellcode- -(IBAction)openEditTeamWindow:(id)sender {
- ReprOSXAppDelegate *myDelegate = (ReprOSXAppDelegate *)[NSApp delegate];
- NSMutableArray *myMutableArray = [NSMutableArray arrayWithArray:[[myDelegate gruppe]teams]];
- [myMutableArray retain];
- [NSApp beginSheet:editTeamWindow
- modalForWindow:mainWindow
- modalDelegate:self
- didEndSelector:@selector(editTeamDidEnd: returnCode: contextInfo:)
- contextInfo:NULL];
- }
 
 Das Bearbeiten geht wie gesagt in einem Textfeld. dabei soll die Tabelle (steht bis jetzt nur der Mannschaftsname drinnen) "on-the-fly" aktualisiert werden der Code dazu sieht so aus und klappt auch:Alles anzeigenQuellcode
 die methode zum Speichern (Button OK) sieht so aus:beim Abbrechen wird halt nichts neu gesetzt, sondern nur das Sheet geschlossen.
 Das Problem ist jetzt: Wenn ich neue Mannschaften hinzufüge und dann Abbreche und wieder das Sheet aufmach, seh ich keine neuen Mannschaften, beim Speichern hingegen schon - das tut also wie gewünscht. Wenn ich allerdings den teamName ändere, wird das übernommen, auch bei Abbrechen. Wo ist der Fehler? Call-by-reference? Aber wieso übernimmt er dann die neuen Mannschaften nicht auch beim Abbrechen?
 Achja: wie ihr vielleicht seht kämpfe ich noch mit der Speicherverwaltung. Wenn ich den GC einsetze, kann ich mir dann das ganze retain und release Zeug sparen? Das treibt mich nämlich noch zur Verzweiflung. Und wenn da oben jemand Fehler sieht dann seid bitte so nett und gebt mir Hinweise. Danke.
- 
			Mit Cocoa macht man das alles etwas anders und es ist für Dich auch viel einfacher, wenn Du den Cocoa-way gehst. Kennst Du das Model-View-Controller Design Pattern?
 Falls nicht, lese Dich da im Cocoa-Fundamentals Guide ein.
 
 Im Grunde läuft es darauf hinaus, dass Du Dir fast Deinen kompletten Code sparen kannst, die zu verwendenden Techniken heissen Key-Value-Coding, Key-Value-Observing und Bindings.
 
 Dein Array mit den Gruppen solltest Du (über sog. Accessoren) im Modell speichern, dann wird auch die komplette Speicherverwaltung transparent, was Du jetzt z.T. richtig (Zeile 4 im ersten Code-Beispiel), z.T. falsch machst (Zeile 5 und 12 im zweiten Beispiel sind unnötig) Stichworte: Autorelease pools und Memory management. Dann benutzt Du vorgefertigte Controller von Cocoa (in Deinem Fall NSArrayController) und bindest Deine views daran.
 
 Viele Grüße, SumpfMonster
- 
			Hallo,
 das mit den Bindings hab ich mir angesehen, versteh ich so weit und hab's eingebaut. Bei "Continuously update value" hab ich einen Haken gesetzt, dann aktualisiert er auch den Wert in der Tabelle.
 Das Problem bleibt allerdings. Wenn ich einen Teamnamen änder und dann auf "Abbrechen" klick, wird trotzdem gespeichert. Sind meine Methoden save (s.o.) und openEditTeamWindow (unten) richtig?
 
 Alles anzeigenBrainfuck-Quellcode- -(IBAction)openEditTeamWindow:(id)sender {
- ReprOSXAppDelegate *myDelegate = (ReprOSXAppDelegate *)[NSApp delegate];
- NSMutableArray *myMutableArray = [NSMutableArray arrayWithArray:[[myDelegate gruppe]teams]];
- [myMutableArray retain];
- [self setNewTeams:[NSMutableArray arrayWithArray:myMutableArray]];
- NSLog(@"----------------------------" );
- NSLog(@"%@", [[myDelegate gruppe]teams] );
- NSLog(@"----------------------------" );
- NSLog(@"%@", newTeams );
- NSLog(@"----------------------------" );
- [NSApp beginSheet:editTeamWindow
- modalForWindow:mainWindow
- modalDelegate:self
- didEndSelector:@selector(editTeamDidEnd: returnCode: contextInfo:)
- contextInfo:NULL];
- }
 
 
 Ich nehm an, dass er zwar ein neues Array erstellt, aber nur den Speicherort der Mannschaften referenziert und die nicht auch irgendwie neu zwischenspeichert. Bei letzterer gibt er nämlich den gleichen Speicherort der Teams an.... (edit: hat sich nach einer recherche bestätigt; hat da jemand einen Lösungsansatz? da hab ich noch nix gefunden)
 Alles anzeigenBrainfuck-Quellcode- 2009-12-07 17:05:38.195 ReprOSX[23731:903] ----------------------------
- 2009-12-07 17:05:38.196 ReprOSX[23731:903] (
- "<Team: 0x20003b0c0>",
- "<Team: 0x20003b040>",
- "<Team: 0x20003b000>"
- )
- 2009-12-07 17:05:38.196 ReprOSX[23731:903] ----------------------------
- 2009-12-07 17:05:38.197 ReprOSX[23731:903] (
- "<Team: 0x20003b0c0>",
- "<Team: 0x20003b040>",
- "<Team: 0x20003b000>"