Bonne façon de créer/utiliser un Singleton NSMutableArray pour Xcode 4
J'ai passé en revue (et essayé) d'un groupe de threads ici sur les Singletons et NSMutableArrays. Je suis nouveau sur Objective-C, de sorte s'il vous plaît garder avec moi.
Je veux simplement créer un peu de tableaux qui peuvent être accessibles à partir de n'importe quel affichage/.m fichier.
Quel est le meilleur (ou le plus concis) codant pour un Singleton?
Ci-dessous est ce que j'ai aujourd'hui et je reçois
1 avertissement au .m '@mise en œuvre " - "mise en œuvre Incomplète"
1 erreur lors de l'utilisation dans une vue .m de fichier "initialiseur élément n'est pas une constante de compilation"
C'est le code que j'ai maintenant - mon GlobalData.h fichier:
#import <Foundation/Foundation.h>
@interface GlobalData : NSObject {
NSMutableArray *listOfHeadings;
NSMutableArray *listOfItems1;
NSMutableArray *listOfItems2;
}
@property(nonatomic,retain)NSMutableArray *listOfHeadings;
@property(nonatomic,retain)NSMutableArray *listOfItems1;
@property(nonatomic,retain)NSMutableArray *listOfItems2;
+(GlobalData*)getInstance;
@end
Mon GlobalData.m fichier:
#import "GlobalData.h"
@implementation GlobalData
@synthesize listOfHeadings;
@synthesize listOfItems1;
@synthesize listOfItems2;
static GlobalData *instance=nil;
+(GlobalData *)getInstance
{
@synchronized(self)
{
if(instance==nil)
{
instance= [GlobalData new];
}
}
return instance;
}
@end
Et dans une vue .m fichier (simplifié):
#import GlobalData.h
GlobalData *globDat=[GlobalData getInstance]; //error occurs here
Quelqu'un peut-il signaler le problème et si il y a meilleur codage, merci de m'éclairer merci!
MODIFIER
Voici quelques liens que j'ai essayé de l'utiliser:
Puis-je avoir un seul NSMutableArray dans mes multiples points de vue de l'application?
iPhone aider avec classe singleton
- Utilisation Matt Galaghers singleton squelette.
Vous devez vous connecter pour publier un commentaire.
Dans ce cas, vous pourriez être faire plus que vous devez. Accordé ce n'est certainement pas toujours la meilleure solution, mais vous pouvez mettre votre NSMutableArray comme une propriété dans votre Délégué d'Application et ensuite facilement les consulter à partir de n'importe quel point de vue. En le faisant de cette manière - vous n'êtes pas de blocage comme un "singleton", mais il y a une "instance du singleton' de celui-ci (ce qui aide beaucoup pour la testabilité).
J'ai simplifié ce processus ici:
YourAppDelegate.h
YourAppDelegate.m
YourViewController.m
À partir de ce point vous pouvez faire toutes les manipulations sur cette valeur.
Voici le "moderne" de la version d'une seule méthode pour transformer une classe en un Singleton (dans ce cas formaté comme un fragment de code). Il fonctionne en iOS4.x ou supérieur:
Mais, avez-vous vraiment besoin d'un singleton d'un seul NSMutableArray? Vous pouvez utiliser la construction de singleton - votre demande de déléguer, ce qui est obtenu par l'appel:
NSMutableArray
(pour les dictionnaires et les chaînes de caractères), que je peux utiliser dans 3-4 de vue différents contrôleurs. J'ai commencé à créer un singleton, mais je ne suis pas vraiment sûr, que c'est la meilleure idée. J'ai lu beaucoup d'avis sur le stockage des données dans leAppDelegate
est mauvais, mais d'après vos commentaires je suis un peu confus. Que pensez-vous, un tableau ne fera de mal à rien? Je dois aussi en mesure de modifier son contenu de manière dynamique, basée sur les données téléchargées. Jusqu'à présent, leAppDelegate
version a l'air plus facile pour moi.L'erreur
initializer element is not a compile-time constant
n'est pas lié à la façon dont vous créez votre singleton. L'erreur est de savoir comment vous êtes accès votre singleton. Vous faites cela en dehors d'une fonction:Cela signifie que vous essayez d'initialiser une variable globale (
globDat
) comme la valeur de l'expression[GlobalData getInstance]
. Vous ne pouvez initialiser les variables globales à des expressions qui sont "constantes de compilation". Cela signifie que les choses comme0
ou"fred"
ou8/2
. La valeur de[GlobalData getInstance]
ne peut pas être calculée au moment de la compilation, il ne peut donc pas être utilisé pour initialiser la variable globale.Au lieu de cela, vous devez simplement utiliser
[GlobalData getInstance]
à l'intérieur de votre corps de fonction de l'endroit où vous êtes en train d'essayer d'utiliser leglobDat
variable.Comme pour l'avertissement,
Incomplete implementation
, je ne vois pas ce qu'il manque. Peut-être que vous n'avez pas poster tout le code deGlobalData.h
. De toute façon, vous devriez être en mesure de cliquer sur l'avertissement (où il apparaît sur le côté droit de la fenêtre de l'éditeur) et Xcode vous montrer ce qu'il manque.C'est la façon dont je créer mon Singleton:
Singleton.h
Sigleton.m
Ensuite, lorsque vous souhaitez appeler votre Singleton:
NSMutableArray
que dans 3 ou 4ViewControllers
, recommandez-vous de cette solution? Je me demande simplement ce qui sera le mieux, de le stocker dans leAppDelegate
ou dans un singleton.