Singleton freigegebene Datenquelle in Objective-C
Hey Leute - ich Schreibe eine ziemlich einfache iPhone-Anwendung. Die Daten stammen aus einer plist-Datei (NSDictionary im Grunde), dass ich versucht bin laden in eine singleton-Klasse und verwenden Sie Sie in meine verschiedenen view-Controller Zugriff auf die Daten.
Hier ist die Umsetzung für meinen singleton (stark nachempfunden dieser thread)
@implementation SearchData
@synthesize searchDict;
@synthesize searchArray;
- (id)init {
if (self = [super init]) {
NSString *path = [[NSBundle mainBundle] bundlePath];
NSString *finalPath = [path stringByAppendingPathComponent:@"searches.plist"];
searchDict = [NSDictionary dictionaryWithContentsOfFile:finalPath];
searchArray = [searchDict allKeys];
}
return self;
}
- (void)dealloc {
[searchDict release];
[searchArray release];
[super dealloc];
}
static SearchData *sharedSingleton = NULL;
+ (SearchData *)sharedSearchData {
@synchronized(self) {
if (sharedSingleton == NULL)
sharedSingleton = [[self alloc] init];
}
return(sharedSingleton);
}
@end
Also immer wenn ich versuche, auf die searchDict oder searchArray Eigenschaften an anderer Stelle in meiner Anwendung (wie ein TableView delegate) etwa so:
[[[SearchData sharedSearchData] searchArray] objectAtIndex:indexPath.row]
Bekomme ich eine Ausnahme, * * * - [NSCFSet objectAtIndex:]: unrecognized selector geschickt Instanz 0x5551f0
Ich bin mir nicht wirklich sicher, warum das objectAtIndex Nachricht wird gesendet, um eine NSCFSet Objekt, fühle ich mich wie mein singleton implementiert ist falsch oder sowas. Ich habe auch versucht, eine komplexere singleton-Implementierung wie empfohlen von apple in der oben genannten thread und hatte das gleiche problem. Vielen Dank für jeden Einblick, den Sie bieten kann.
InformationsquelleAutor Andy Bourassa | 2008-12-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
In Ihrem
-init
Methode, die Sie direkt Zugriff auf die Instanz-Variablen und die Sie nicht behalten Sie. Sie sind immer freigegeben, und Ihr Speicher ist aufgebraucht, die durch andere Objekte, die später in Ihrer Anwendung ein Leben lang.Behalten entweder Ihre Objekte, die Sie erstellen, gibt es oder verwenden Sie den non-convenience-Methoden zu generieren.
Die tags in der @property-definition definieren Sie, wie die Zugriffsmethoden arbeiten. Im Falle von (nicht-Atomare, behalten), die Sie nicht synchronisieren über mehrere threads und Sie behalten das Objekt zugewiesen wird (was atomar ist von Natur aus sowieso IIRC). Sie wurden direkt zuweisen der Variablen obwohl, umgehen.
Siehe mein Kommentar auf die andere Antwort auf die Frage, warum sollten Sie nicht mit dem selbst.variable syntax in Ihrem -init und dealloc-Methoden aber. Kurz-Antwort: die unerwünschte Nebenwirkungen.
InformationsquelleAutor Ashley Clark
Wann immer Sie weisen synthetisiert Variablen, tun Sie es durch 'self', also:
}
Auch sicher, dass Sie festgelegt haben, um diese Variablen zu 'behalten' in der header-Datei.
Ich sollte auch hinzufügen, Sie raten es in der -dealloc auch für den gleichen Gründen.
InformationsquelleAutor Chris Jefferson
werden die Werte festgelegt, die durch die setter; es löst den vorherigen Wert und behält die, die Sie zuweisen.
InformationsquelleAutor Sorin Antohi