Singleton source de données partagée en Objective-C
Hey les gens - je suis en train d'écrire est assez simple une application iPhone. Les données proviennent d'un fichier plist (NSDictionary essentiellement), que je suis en train de charger dans une classe singleton et l'utilisation à travers mes différents afficher les contrôleurs d'accès aux données.
Voici la mise en œuvre de mon singleton (fortement calquée sur ce fil)
@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
Donc à chaque fois que j'essaie d'accéder à la searchDict ou searchArray propriétés d'ailleurs dans mon application (comme un TableView délégué) comme suit:
[[[SearchData sharedSearchData] searchArray] objectAtIndex:indexPath.row]
J'obtiens une exception indiquant *** -[NSCFSet objectAtIndex:]: unrecognized sélecteur envoyé à l'instance 0x5551f0
Je ne suis pas vraiment sûr de savoir pourquoi la objectAtIndex le message est envoyé à un NSCFSet objet, j'ai l'impression que ma singleton est mis en œuvre mauvais ou quelque chose. J'ai essayé aussi de plus en plus complexe singleton mise en œuvre, comme recommandé par apple dans le susmentionnés fil et avait le même problème. Merci pour toutes les informations que peut fournir.
OriginalL'auteur Andy Bourassa | 2008-12-10
Vous devez vous connecter pour publier un commentaire.
Dans votre
-init
méthode que vous avez directement accès à vos variables d'instance, et vous n'êtes pas les retenir. Ils ont libéré et leur mémoire est utilisée par d'autres objets plus tard dans la durée de vie de votre application.Soit de conserver vos objets que vous êtes en train de créer ou d'utiliser la non-convenance des méthodes pour les produire.
Les balises dans le @définition de propriété de définir comment les accesseurs de travail. Dans le cas de (non-atomique, conserver) elles ne sont pas synchronisées sur plusieurs threads et ils conservent l'objet assigné (qui est atomique, par nature, de toute façon IIRC). Vous avez été directement assigner les variables cependant, les contourner.
Voir mon commentaire sur l'autre réponse pourquoi vous ne devriez pas être à l'aide de l'auto.variable syntaxe dans votre -init et -dealloc méthodes. Réponse courte: effets indésirables.
OriginalL'auteur Ashley Clark
Chaque fois que vous affectez synthétisé variables, de le faire par le "moi", donc:
}
Assurez-vous également que vous avez mis en place ces variables à 'conserver ed dans le fichier d'en-tête.
Je dois aussi ajouter qu'ils le déconseillent en dealloc aussi pour les mêmes raisons.
OriginalL'auteur Chris Jefferson
les valeurs sont définies par le biais de l'incubateur; il libère la valeur précédente et conserve l'un de vous affecter.
OriginalL'auteur Sorin Antohi