Bereiche
News
Rewind
Tipps & Berichte
Forum
Galerie
Journals
Events
Umfragen
Themenwoche
Kleinanzeigen
Interaktiv
Anmelden
Registrierung
Zu allen empfangenen Nachrichten
Suche...
Zur erweiterten Suche
Push-Nachrichten von MacTechNews.de
Würden Sie gerne aktuelle Nachrichten aus der Apple-Welt direkt über Push-Nachrichten erhalten?
Forum
>
Entwickler
>
Klassenvariablen in ObjC
Klassenvariablen in ObjC
hans-egon
22.09.04
01:06
Hi ihrs!
Ich hab folgendes Problem. Zu Testzwecken hab ich angefangen ein kleines Programm zu schreiben, mit dem ich plist-Dateien schreiben und dann wieder auslesen will. Ich hab da allerdings ein Problem mit Klassenvariablen.
Hier erst einmal der bisherige Code:
#import
// PrefPane.h
@interface PrefPane : NSObject
{
IBOutlet id popupOutlet;
IBOutlet id text1Outlet;
IBOutlet id text2Outlet;
NSData* xmlData;
NSString* error;
}
// Klassenvariablen?
static NSDictionary* myDict;
static NSString* prefsPath;
+ (void)initialize;
- (IBAction)saveAction:(id)sender;
@end
// PrefPane.m
#import "PrefPane.h"
@implementation PrefPane
// Initialisierung der Klassenvariablen?
+ (void)initialize {
static BOOL initialized = NO;
if (!initialized) {
myDict = [NSDictionary dictionaryWithObjectsAndKeys:
@"erster Text", @"textField1",
@"zweiter Text", @"textField2",
@"Display 1", @"popup",
prefsPath = @"/Users/me/Desktop/PrefPane.plist";
initialized = YES;
}
}
- (IBAction)saveAction:(id)sender
{
// prefsPath ist hier noch initialisiert,
// myDict jedoch nicht mehr ...
// also schlägt die Konvertierung nach XML fehl ...
// warum ist myDict nicht mehr initialisiert?
xmlData = [NSPropertyListSerialization dataFromPropertyList: myDict
format: NSPropertyListXMLFormat_v1_0
errorDescription: &error];
if(xmlData) {
NSLog(@"No error creating XML data.");
[xmlData writeToFile:prefsPath atomically:YES];
} else {
NSLog(error);
[error release];
}
}
@end
Wie man hoffentlich an den Kommentaren sehen kann, bin ich mir noch nicht einmal sicher, ob man in der Art überhaupt Klassenvariablen deklariert geschweige denn sie dann initialisiert.
Schau ich mir das Ganze im Debugger an, wird alles wirklich in +(void)initialize initialisiert, zu Beginn von +(IBAction)saveAction:(id)sender ist prefsPath immer noch gesetzt, myDict jedoch nicht mehr.
Jemand eine Idee?
Nebenbei - wenn ich keine Klassen- sondern Instanzvariablen anlege, funktioniert alles Bestens. Es geht mir hier auch mehr darum, dass ich das mal verstehe, warum solche Fehler wie oben beschrieben auftreten.
Vielen Dank schon mal im Voraus! Grüßle!
Hilfreich?
0
Kommentare
Rantanplan
22.09.04
02:28
Nimm deine
static NSDictionary* myDict;
static NSString* prefsPath;
aus dem Header raus und steck's in die .m-Datei, da gehören sie hin. Im Header brauchst du sie nicht und wenn, dann müssen sie dort als extern static blabla*... stehen.
„Wenn ich nicht hier bin, bin ich auf dem Sonnendeck“
Hilfreich?
0
Rantanplan
22.09.04
02:29
Äh... späte Stunde. extern static bringt nix
Vergiß es, nimm sie aus dem Header raus und definiere sie als globale Variablen im .m-File, letztendlich sind Klassenvariablen nichts anderes.
„Wenn ich nicht hier bin, bin ich auf dem Sonnendeck“
Hilfreich?
0
Rantanplan
22.09.04
02:35
Das if (!initialized) im +(void)initialize kannst du dir übrigens sparen. initialize wird nur einmal aufgerufen, bevor die erste Instanz dieser Klasse ins Leben gerufen wird.
„Wenn ich nicht hier bin, bin ich auf dem Sonnendeck“
Hilfreich?
0
hans-egon
22.09.04
12:05
Na das hat mich ja schon etwas weiter gebracht. Dafür erstmal Dank.
Wenn ich nun diese globalen Variablen deklarieren will, an welcher Stelle im *.m-File? Und was macht sie global? Und das +(void)initialize ist dann auch dazu da, sie zu initialisieren?
Ich hatte eben versucht, sie mit dem static davor einmal vor und einmal nach dem @implementation unterzubringen. Das war es so erst einmal nicht ...
Ich wäre für weitere Hilfe sehr dankbar.
Grüßle!
Hilfreich?
0
Rantanplan
22.09.04
12:31
Äh, sorry, hatte gestern deinen Source nur überflogen.
Die statics aus dem .h raus ins .m zu nehmen war schon richtig, aber du hast einen anderen Fehler
Du vergißt das retain auf dem myDict. Globale Variablen vor oder nach @implementation ist egal, dein Problem ist, daß myDict wieder freigegeben wird.
„Wenn ich nicht hier bin, bin ich auf dem Sonnendeck“
Hilfreich?
0
hans-egon
22.09.04
13:35
Ja klasse, das funktioniert!
Aber kannst Du mir erklären, warum das bei dem prefsPath anders ist? Ich hab mir mal den retainCount dafür ausgeben lassen. Bei myDict wird der Zähler schön eins rauf gezählt. Doch der Zähler von prefsPath bleibt mit und ohne retain bei -1. Warum denn auch gerade -1?
Wie ich ja schon oben schrieb, mit der Pfadangabe hab ich ja eigentlich keine Probleme. Die erkennt er immer. Aber das retain sollte doch auf nem NSString genauso anwendbar sein wie auf nem NSDictionary, sind doch beide von NSObject abgeleitet ... Bisher hab ich in keiner Dokumentation was über eine unterschiedliche Handhabe gelesen ...
Hilfreich?
0
Rantanplan
22.09.04
14:07
Nu, das ist doch ein konstanter String. Der wird nicht dynamisch zur Laufzeit angelegt, daher wird der auch nie freigegeben.
„Wenn ich nicht hier bin, bin ich auf dem Sonnendeck“
Hilfreich?
0
Rantanplan
22.09.04
14:08
Hättest du geschrieben:
myDict = [NSDictionary dictionaryWithObjectsAndKeys:...];
prefsPath = [NSString stringWithString:@"/Users/me/Desktop/PrefPane.plist"];
dann hättest du bei beiden das gleiche Problem gehabt.
„Wenn ich nicht hier bin, bin ich auf dem Sonnendeck“
Hilfreich?
0
hans-egon
22.09.04
15:13
Danke!
Das hatte mir echt zum Puzzle noch gefehlt!
Hilfreich?
0
Agrajag
22.09.04
16:13
hans-egon: Für den Fall, dass du es noch nicht kennst, es gibt ein deutschsprachiges Mec OS Developer Forum
Vielleicht ist es ja für dich Hilfreich. Dort gibt es auf der Startseite einen Link zu einem Developer-Wiki. Dort findets du auch einige Erklärungen zum Speichermanagement (Retain, Release & Co). und natürlich noch mehr. Es steht aber noch am Anfange.
Ich hab mich da auch schon ein paar mal umgesehen, aber mir fehlt leider die Zeit mich mit ObjC/Cocoa zu beschäftigen
Was auch hilfreich sein kann: Es gibt ein paar (englischsprachige) Mailinglisten zum Thema OSX-Programmierung. Die hab ich auch schon abonniert, ohne allerdings jetzt direkt davon profitieren zu können (keine Zeit). Ich erhoffe mir jedenfalls davon, dass ich , wenn ich mal Zeit dafür habe, eine Umfangreiche Datenbank zum Stöbern zur Verfügung habe.
Apple Listen:
im Speziellen Cocoa-Dev:
macosx-dev:
Hilfreich?
0
hans-egon
22.09.04
17:56
Auf den Seiten werd ich mich mal umschauen. Es ist ja meist so, dass ich gar nicht recht weiß, wonach ich eigentlich suchen muss, weil ich mir den Fehler nicht erklären kann. ... Aber nach und nach - es wird langsam.
Grüßle!
Hilfreich?
0
Rantanplan
22.09.04
18:04
Unerklärliche Fehler.... Einfach hier posten, Lösung kommt bestimmt
„Wenn ich nicht hier bin, bin ich auf dem Sonnendeck“
Hilfreich?
0
Kommentieren
Diese Diskussion ist bereits mehr als 3 Monate alt und kann daher nicht mehr kommentiert werden.