iOS Interviewvorbereitung 5 – Singletons
Das Singleton-Muster ist ein Entwurfsmuster, das sicherstellt, dass eine Klasse nur eine Instanz hat, und einen globalen Zugriffspunkt auf diese Instanz bietet. Dies kann nützlich sein, wenn eine Klasse von mehreren Teilen einer App gemeinsam genutzt werden muss, es jedoch nicht praktikabel oder wünschenswert ist, mehrere Instanzen der Klasse zu erstellen. In iOS ist das Singleton-Muster ein häufig verwendetes Entwurfsmuster.
Interview Fragen
- Was ist Singleton und wie wird es in der iOS-Entwicklung verwendet?
- Können Sie das Singleton-Entwurfsmuster und seine Vorteile erklären?
- Welche Möglichkeiten gibt es, mehrere Instanzen von Singleton in einer Multithread-Umgebung zu verhindern?
- Können Sie ein Beispiel dafür geben, wann Sie Singleton in Ihrer iOS-App verwenden würden?
- Wie testet man Singleton in iOS?
Ein häufiges Problem bei Singletons ist, dass sie oft nicht Thread-sicher sind. Sie werden häufig von mehreren Controllern verwendet, die gleichzeitig auf die Singleton-Instanz zugreifen.
Beim Erstellen eines Singletons müssen Sie zwei Dinge berücksichtigen
- Die Instanz sollte Thread-sicher erstellt werden
- Sie sollten die Init-Methode der Klasse als privat markieren, um zu verhindern, dass weitere Instanzen erstellt werden
- Während der Initialisierung der Singleton-Instanz.
- Während Lese- und Schreibvorgängen in die Instanz.
Um das Singleton-Muster in Swift zu implementieren, wird die Klasse, die ein Singleton sein muss, mit dem staticSchlüsselwort definiert, das angibt, dass die Klasse nur eine Instanz hat. Eine statische Variable wird verwendet, um die Instanz der Klasse zu speichern, und eine statische Methode wird verwendet, um auf die Instanz zuzugreifen. Hier ist ein Beispiel für eine Singleton-Klasse in Swift
class Singleton {
// Swift guarantees initialization is atomic
// Swift treats the code performing initialization as a critical section
static let shared = Singleton()
// prevents the creation of additional instances of the class.
private init() {}
}
let singleton = Singleton.shared
@implementation MySingleton
// Lazy initializer
+ (instancetype)sharedInstance {
static dispatch_once_t once;
static id sharedInstance;
// The token ensures that init is executed only once in thread safety manner
dispatch_once(&once, ^{
_sharedInstance = [[self alloc] init];
});
return sharedInstance;
}
// Prevent creating new instance of the singleton
- (instancetype)init __attribute__((unavailable("Use +[MyClass sharedInstance] instead")));
+ (instancetype)new __attribute__((unavailable("Use +[MyClass sharedInstance] instead")));
@end
Vorteile
- Stellt sicher, dass nur eine einzige Instanz einer Klasse erstellt wird, was dazu beitragen kann, Speicher zu sparen und die Leistung zu verbessern.
- Stellt einen globalen Zugriffspunkt auf die Instanz der Klasse bereit, wodurch die Verwendung in Ihrem Code vereinfacht werden kann.
- Kann nützlich sein, um gemeinsam genutzte Ressourcen wie Datenbanken oder Netzwerkverbindungen zu implementieren, die von verschiedenen Teilen Ihres Codes gemeinsam genutzt werden müssen.
- Kann das Testen und Debuggen Ihres Codes erschweren, da ein globaler Status eingeführt wird, der von verschiedenen Teilen Ihres Codes gemeinsam genutzt wird.
- Macht es schwierig, mehrere Instanzen einer Klasse zu Test- oder anderen Zwecken zu erstellen.
- Kann zu einer engen Kopplung führen und gegen die Prinzipien des objektorientierten Designs verstoßen.
- Keine gute Option für Aufgaben im Zusammenhang mit Benutzersitzungen, da Sie möglicherweise ein neues Singleton zerstören und erstellen müssen, wenn sich der Benutzer abmeldet.
Es gibt eine Garantie von 1 pro Konto (anstelle einer Garantie von 1 pro App). Der Zugriff ist nicht global (Sie benötigen eine Benutzersitzung). Ähnlich wie bei Singleton, das beim ersten Zugriff träge erstellt wird, wird danach immer dieselbe Instanz zurückgegeben. Beispielsweise wird MyUserSession erstellt, wenn ein authentifizierter Benutzer eine Sitzung beginnt. Es muss in jeden Code eingefügt werden, der Benutzerdaten enthält

![Was ist überhaupt eine verknüpfte Liste? [Teil 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































