Question

Tenter de faire un NSObject appelé « personne » qui contiendra les informations de connexion pour mon application (rien à la fantaisie). L'application est faite d'un contrôleur de navigation avec plusieurs vues de table mais je rencontre des problèmes de partage l'objet personne autour.

Tentative de création d'un objet statique comme ceci:

+ (Person *)sharedInstance {
    static Person *sharedInstance;
    @synchronized(self) {
        if(!sharedInstance)
            sharedInstance = [[Person alloc] init];
        return sharedInstance;
    }
    return nil;
}

Et voici l'en-tête

// Person.h
#import <Foundation/Foundation.h>

@interface Person : NSObject {

    NSString    *fullName;
    NSString    *firstName;
    NSString    *lastName;
    NSString    *mobileNumber;
    NSString    *userPassword;
}

@property(nonatomic, retain) NSString   *fullName;
@property(nonatomic, retain) NSString   *firstName;
@property(nonatomic, retain) NSString   *lastName;
@property(nonatomic, retain) NSString   *mobileNumber;
@property(nonatomic, retain) NSString   *userPassword;

+ (Person *)sharedInstance;
-(BOOL) setName:(NSString*) fname;
-(BOOL) setMob:(NSString*) mnum;
-(BOOL) setPass:(NSString*) pwd;

@end

setters d'objets et getters sont nécessaires dans les différentes parties de l'application. J'ai essayé d'y accéder comme ceci

Person * ThePerson = [[Person alloc] init];
ThePerson = nil;
NSString * PersonsName;
PersonsName = [[Person sharedInstance] firstName];

Tout fonctionne bien à l'écran de connexion, mais il meurt à la prochaine utilisation. habituellement EXC_BAD_ACCESS (eek!).

Il est clair que je suis en train de faire quelque chose de très mal ici. Y at-il un moyen plus facile de partager des objets entre les différents contrôleurs une vue numérique (à la fois codés et xib)?

Était-ce utile?

La solution

Pourquoi ne pas stocker ces informations dans le NSUserDefaults ou le porte-clés?

Autres conseils

Votre méthode +sharedInstance retourne nil quand il devrait être de retour l'instance partagée. De plus, je doute qu'il y ait une valeur de synchronisation sur ce bloc. La méthode pourrait être écrit plus simplement:

+ (Person *)sharedInstance {
    static Person *sharedInstance;
    if(!sharedInstance) {
        sharedInstance = [[Person alloc] init];
    }
    return sharedInstance;
}

Notez que cela ne crée pas un « objet statique », car il n'y a pas une telle chose en Objective-C; il attribue simplement un objet à une variable statique (probablement ce que vous vouliez dire, mais je voulais juste vous assurer).

Une autre façon de partager un objet entre deux ou plusieurs contrôleurs vue dans un contrôleur de navigation est d'ajouter une propriété aux contrôleurs de vue imbriqués, et appeler la méthode setter avant de naviguer. Par exemple, vous pouvez ajouter une propriété telle que:

@property (nonatomic, retain) Book *book;

à un enfant du contrôleur de vue racine, et l'envoyer un message -setBook: dans la méthode de -tableView:didSelectRowAtIndexPath: du contrôleur de vue racine.

Vous n'êtes pas correctement avec le modèle d'instance partagée. Votre méthode sharedInstance doit alloc et init une nouvelle personne (si elle n'a pas déjà été fait une fois) et l'affecter à la variable statique sharedInstance.

Ensuite, lorsque vous avez besoin d'un pointeur à la personne, vous devez utiliser la méthode de classe d'instance partagée, non alloc et init une nouvelle instance vous.

Techniquement, si vous allez pour une singleton épanouie, votre méthode alloc ne devrait pas vous permettre de créer une nouvelle instance d'une personne.

En outre, je relis juste votre code, et suis tombé sur un peu WTF:

Person * ThePerson = [[Person alloc] init];
ThePerson = nil;

Qu'est-ce que tout au sujet? C'est une fuite de mémoire, là.

Tous vos problèmes peuvent être résolus en remplaçant toutes et toutes les lignes de Person *thePerson = [[Person alloc] init]; avec Person *person = [Person sharedInstance];

init est hinky, si vous souhaitez définir le prenom de la personne faire comme ceci

Person *thePerson = [Person sharedInstance];  
thePerson.name = @"John Public";

pour obtenir le nom sur,

NSString *personName = [[Person sharedInstance] name];  

Cela fonctionne dans toute classe qui #imports "Person.h"

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top