Pregunta

El intento de hacer una llamada NSObject 'persona' que contendrá los datos de acceso para mi aplicación (nada a la fantasía). La aplicación se hace de un controlador de navegación con múltiples vistas de tabla, pero estoy teniendo problemas compartiendo el objeto Person alrededor.

Se ha intentado crear un objeto estático como sigue:

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

Y aquí es la cabecera

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

son necesarios emisores de este objeto y getters en diferentes partes de la aplicación. He estado tratando de acceder a ellos de esta manera

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

Todo funciona bien en la pantalla de inicio de sesión, pero muere en el siguiente uso. por lo general EXC_BAD_ACCESS (eek!).

Es evidente que estoy haciendo algo muy mal aquí. ¿Hay una manera más fácil de compartir objetos entre diferentes unos controladores de vista número (tanto codificada y xib)?

¿Fue útil?

Solución

¿Por qué no almacenar esta información en el NSUserDefaults o el llavero?

Otros consejos

Su método +sharedInstance vuelve nil cuando debería estar regresando la instancia compartida. Además, no creo que haya ningún valor a la sincronización en ese bloque. El método se podría escribir más simplemente:

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

Tenga en cuenta que esto no crea un 'objeto estático', ya que no hay tal cosa en Objective-C; sólo se asigna un objeto a una variable estática (probablemente lo que quería decir, pero sólo quería asegurarse).

Otra manera de compartir un objeto entre dos o más controladores de vista dentro de un controlador de navegación es añadir un alojamiento a la controladores de vista anidadas, y llamar al método setter antes de navegar. Por ejemplo, se podría añadir una propiedad como la siguiente:

@property (nonatomic, retain) Book *book;

a un hijo del controlador de vista raíz, y lo enviará un mensaje -setBook: en el método -tableView:didSelectRowAtIndexPath: del controlador de vista raíz.

No se está utilizando correctamente el patrón de instancia compartida. Su método sharedInstance debe alloc y init una nueva persona (si ya no se ha hecho una vez) y asignarlo a la variable estática sharedInstance.

A continuación, cuando se necesita un puntero a la persona, se debe utilizar el método de la clase instancia compartida, no alloc y init una nueva instancia a sí mismo.

Técnicamente, si usted va para un conjunto unitario completo soplado, su método de alloc no debe permitir que se crea una nueva instancia de una persona.

Además, acabo de volver a leer el código, y me encontré con un poco de un WTF:

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

¿Qué es todo eso? Eso es una pérdida de memoria, allí mismo.

Todos los problemas se pueden resolver mediante la sustitución de cualquiera y todas las líneas de Person *thePerson = [[Person alloc] init]; con Person *person = [Person sharedInstance];

Su inicio es hinky, si desea establecer el primerNombre de la persona que lo hace como esto

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

para obtener el nombre de cabo,

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

que funcionará en cualquier clase que #imports "Person.h"

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top