2010-06-07 3 views
0

J'ai initialisé une classe dans mon singleton appelée DataModel. Maintenant, à partir de mon UIViewController, quand je clique sur un bouton, j'ai une méthode qui essaie d'accéder à cette classe afin que je puisse ajouter un objet à l'un de ses dictionnaires. Ma méthode get/set renvoie le pointeur vers la classe de mon singleton, mais quand je suis de retour dans mon UIViewController, la classe passée ne répond pas aux méthodes. C'est comme si ce n'était pas là. Je pense que cela a quelque chose à voir avec la différence de passer des pointeurs autour des classes ou quelque chose. J'ai même essayé d'utiliser la méthode de copie pour renvoyer une copie, mais pas de chance.Obj-C: Passer des pointeurs vers des classes initialisées dans d'autres classes

UIViewController:

ApplicationSingleton *applicationSingleton = [[ApplicationSingleton alloc] init]; 

DataModel *dataModel = [applicationSingleton getDataModel]; 

[dataModel retrieveDataCategory:dataCategory]; 

Singleton:

ApplicationSingleton *m_instance; 
DataModel *m_dataModel; 

- (id) init { 
    NSLog(@"ApplicationSingleton.m initialized."); 
    self = [super init]; 
    if(self != nil) { 
     if(m_instance != nil) { 
      return m_instance; 
      } 
     NSLog(@"Initializing the application singleton."); 
     m_instance = self; 
     m_dataModel = [[DataModel alloc] init]; 
     } 
    NSLog(@"ApplicationSingleton init method returning."); 
    return m_instance; 
    } 

-(DataModel *)getDataModel { 
    DataModel *dataModel_COPY = [m_dataModel copy]; 
    return dataModel_COPY; 
    } 

Pour la méthode getDataModel, j'ai aussi essayé ceci:

-(DataModel *)getDataModel { 
    return m_dataModel; 
    } 

Dans ma méthode DataModel retrieveDataCategory, je ne pouvais pas quelque chose à travailler. J'ai même juste essayé de mettre un NSLog dedans mais il ne viendrait jamais sur la console.

Des idées?

+0

une chose simple à vérifier: assurez-vous que vos objets ne sont pas nuls, car un message à nil est un no-op – cobbal

+0

Oh, mon DataModel * m_dataModel n'est pas nul. Dans ma méthode init pour cette classe, j'ai tout un tas de choses avec NSLogs pour le prouver. ;) Alors, c'est vivant et plein de trucs. C'est juste quand je passe la classe initialisée de mon singleton à mon UIViewController, le UIViewController ne peut appeler aucune méthode sur le DataModel. – FnGreg7

+0

Je suppose que 'm_instance' et' m_dataModel' ne sont pas déclarés comme ivars dans '@ interface' et que ces déclarations sont dans le fichier d'implémentation? –

Répondre

1

Il est fort probable que vous envoyez des messages qui sont ignorés, par ex. ils sont envoyés à des objets qui n'existent pas/ne sont pas ceux que vous recherchez, et pour une raison quelconque, ils ne s'écrasent pas. Cela se produit dans le cas de la messagerie nulle, ou éventuellement d'autres valeurs illégitimes. Bien que vous sembliez vous attendre à ce que les variables m_ soient initialisées à 0, ce n'est pas une bonne forme, et de plus vous ne suivez pas un modèle objc typique pour vos singletons - m_dataModel devrait être un ivar de m_instance, et m_instance devrait probablement être déclaré statique, comme vous probablement ne veulent pas l'accès à partir d'autres fichiers directement. De plus, la source de votre bogue le plus probable est en quelque sorte la méthode -init, qui ne devrait jamais être appelé un singleton - au lieu de faire quelque chose comme ceci:

+ (ApplicationSingleton *)sharedInstance { 
    static ApplicationSingleton *instance = nil; 
    if(!instance) { 
      instance = [[self alloc] init]; //or whatever custom initializer you would like, furthermore some people just put the initialization code here and leave -init empty 
    } 
    return instance; 
} 

le code que vous avez des fuites maintenant parce que vous allouez une object (self) et ne le libère pas avant de renvoyer une instance potentiellement différente (celle partagée si elle existe déjà), de telle sorte que la nouvelle allocation est généralement perdue.

+0

Il est garanti que les variables d'instance seront initialisées à 0. Il est parfaitement possible de supposer des choses qui font partie du langage, tout comme nous supposons que 1 + 3 sera 4. – Chuck

+0

Ma formulation était mauvaise - je voulais dire que ce n'est pas particulièrement clair, et donc une mauvaise pratique en général, bien que techniquement incorrecte. De plus, comme la variable n'est pas déclarée statique, si ailleurs dans le code (vraisemblablement dans un fichier différent, à la portée du fichier) s'il y avait une autre déclaration de la ou des variable (s) AVEC un initialiseur statique, les variables ne seraient pas 0 (obvi ils seraient tout ce qu'ils ont été initialisés ailleurs dans le code). Bien que cela ne se produise probablement pas, il s'agit plutôt d'une pratique exemplaire, comme la fabrication d'ivars uniques, et pas seulement de vars statiques. –

+1

@Chuck: Ceux-ci ne me ressemblent pas, ils semblent être dans le fichier d'implé[email protected]: Si ce n'est pas clair pour quelqu'un que les ivars sont initialisés à 0, cette personne devrait revenir à lire sur les bases de la langue :) –

Questions connexes