Domanda

Il tentativo di fare un NSObject chiamato 'persona' che conterrà i dati di login per la mia applicazione (niente a che fantasia). L'applicazione è costituita da un controller di navigazione con visualizzazioni multiple tavolo, ma sto avendo problemi di condividere l'oggetto Person intorno.

Tentativo di creare un oggetto statico come questo:

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

E qui è l'intestazione

// 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

incastonatori Questo oggetto e getter sono necessari in diverse parti dell'applicazione. Mi hanno cercato di accedervi come questo

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

Tutto funziona bene nella schermata di login, ma muore al successivo utilizzo. di solito EXC_BAD_ACCESS (eek!).

È chiaro che sto facendo qualcosa di molto sbagliato qui. C'è un modo più semplice per condividere oggetti tra diversi un controller di vista numero (sia codificata e XI ter)?

È stato utile?

Soluzione

Perché non conservare queste informazioni nel NSUserDefaults o il portachiavi?

Altri suggerimenti

Il tuo metodo +sharedInstance ritorna nil quando dovrebbe essere tornando l'istanza condivisa. Inoltre, dubito che ci sia alcun valore per la sincronizzazione su quel blocco. Il metodo potrebbe essere scritto più semplicemente:

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

Si noti che questo non crea un 'oggetto statico', dal momento che non c'è nulla di simile in Objective-C; solo assegna un oggetto a una variabile statica (probabilmente quello che voleva dire, ma volevo solo fare in modo).

Un altro modo per condividere un oggetto tra due o più controller di vista all'interno di un controller di navigazione è quello di aggiungere un alloggio ai controller di vista nested, e chiamare il metodo setter prima di navigazione. Ad esempio, è possibile aggiungere una proprietà come la seguente:

@property (nonatomic, retain) Book *book;

ad un bambino del controller della vista radice, e inviare un messaggio -setBook: nel metodo -tableView:didSelectRowAtIndexPath: vista del controller di root.

Non stai usando correttamente il modello di istanza condivisa. Il tuo metodo sharedInstance dovrebbe alloc e init una persona nuova (se non è già stato fatto una volta) e assegnarlo alla variabile statica sharedInstance.

Poi, quando avete bisogno di un puntatore alla persona, è necessario utilizzare il metodo della classe istanza condivisa, non alloc e init una nuova istanza se stessi.

Tecnicamente, se si sta andando per un Singleton in piena regola, il metodo alloc non dovrebbe permettere la creazione di una nuova istanza di una persona.

Inoltre, ho appena riletto il tuo codice, e sono imbattuto in un po 'di WTF:

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

Che cosa è che tutto questo? Questa è una perdita di memoria, proprio lì.

Tutti i vostri problemi possono essere risolti sostituendo eventuali e tutte le linee di Person *thePerson = [[Person alloc] init]; con Person *person = [Person sharedInstance];

Il tuo init è Hinky, se si desidera impostare il firstName di persona fare in questo modo

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

per ottenere il nome fuori,

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

che funzionerà in qualsiasi classe che #imports "Person.h"

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top