leicht gemacht: Singletons

Hallo Zusammen,

heute möchte ich euch das Design Pattern ( = Entwurfsmuster) Singleton ( = Einzelstück) vorstellen. Singletons sind ein Klasse von der es zu jeder Zeit nur ein Objekt geben kann und darf. Zusätzlich sind sie üblicherweise global verfügbar.

Ich nutze Singletons sehr oft, um zum Beispiel eine globale Methode dem ganzen Programm verfügbar zu machen. Darüber hinaus können dem Singleton Variabeln zugewiesen werden, welche dann von Klassen übergreifend genutzt werden können.

Erstellen wir uns also in XCode eine neue Klasse die als Vorlage NSObject nimmt (File -> New File > Object C Class). Meine wird Klasse wird DataStore heißen.

Im Header definieren wir uns eine Klassenmethode, eine Instanzmethode und vielleicht eine property Variable.

@interface DataStore : NSObject {

	NSInteger			optionsSound;
}

@property (readwrite) NSInteger		optionsSound;

+ (DataStore *)getData;
- (float)convertFontSizeToPad:(float)inputSize;
@end

Das + vor getData bedeutet, dass es eine Klassenmethode ist – die Methode kann also auf die Klasse aufgerufen werden und benötigt nicht ein konkretes Objekt. Der Rückgabewert von getData ist dann ein Object vom Typ DataStore; also unser Singleton. Man kann getData auch mit den bereits bekannten +(id) scene Methoden vergleichen.

Wenden wir uns nun der Implementierung zu.

#import "DataStore.h"

@implementation DataStore
@synthesize optionsSound;

static DataStore *_sharedContext = nil;

+ (DataStore *) getData
{
    if (!_sharedContext) {
        _sharedContext = [[self alloc] init];
    }
    return _sharedContext;
}
-(float)convertFontSizeToPad:(float)inputSize{
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
        return (vlaue * 2)*1.067;
    } else {
        return vlaue;
    }
}
@end

Falls ihr nicht ARC verwendet, was ihr aber tun solltet, fehlt noch die dealloc Methode. Die getData Methode prüft ob es bereits ein Object _sharedContext vom Typ Datastore gibt (if (!_sharedContext)). Falls dem nicht so ist, wird eben dieses Object erzeugt. In beiden Fällen wird das Object per return der Aufrufenden Instanz zurückgegeben.Darüber hinaus erzeugen wir mit @synthesize optionsSound; die Getter und Setter Methoden unserer Variabel – auf diese Weise sparen wir uns etwas Quellcode.

Das ist auch schon die ganze Singleton Magie. Wir können nun überall im Programm, sofern die Datastore Klasse im Header importiert ist, mit unserem Singleton Object arbeiten.

    // testen ob der Sound an ist
    if ([[DataStore getData] optionSound] == 1) NSLog(@"Sound ist an");

    // die globale Variable verändern
    [[DataStore getData] setOptionSound:0];

    // die Methode benutzen
    float fontSize = [[DataStore getData] convertFontSizeToPad:17];

Falls ihr Fragen zum Entwurfsmuster Singleton habt, schreibt mir doch einfach einen Kommentar.

2 thoughts on “leicht gemacht: Singletons

  • Hallo,

    das klingt gut, danke. damit könnte ich das problem lösen, dass mein audio player momentan nicht wirklich global ist, also zwischen dem wechseln des viewcontrollers abstürzt. müsste ich dann alle methoden des players in die singleton klasse schreiben?

    Gruss, martin

    • Das kann man so pauschal nicht beantworten, da ich nicht weiß welche Methoden du da meinst. So etwas wie „nextSong“ würde ich in dann auch in die Singlen Klasse schreiben.

Schreibe einen Kommentar zu admin Antworten abbrechen

Deine E-Mail-Adresse wird nicht veröffentlicht.