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
hans-egon22.09.0401: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!
0

Kommentare

Rantanplan
Rantanplan22.09.0402: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“
0
Rantanplan
Rantanplan22.09.0402: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“
0
Rantanplan
Rantanplan22.09.0402: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“
0
hans-egon
hans-egon22.09.0412: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!
0
Rantanplan
Rantanplan22.09.0412: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“
0
hans-egon
hans-egon22.09.0413: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 ...
0
Rantanplan
Rantanplan22.09.0414: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“
0
Rantanplan
Rantanplan22.09.0414: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“
0
hans-egon
hans-egon22.09.0415:13
Danke! Das hatte mir echt zum Puzzle noch gefehlt!
0
Agrajag22.09.0416: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:
0
hans-egon
hans-egon22.09.0417: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!
0
Rantanplan
Rantanplan22.09.0418:04
Unerklärliche Fehler.... Einfach hier posten, Lösung kommt bestimmt
„Wenn ich nicht hier bin, bin ich auf dem Sonnendeck“
0

Kommentieren

Diese Diskussion ist bereits mehr als 3 Monate alt und kann daher nicht mehr kommentiert werden.