Frage

ein NSObject ‚Person‘ zu machen Versuch genannt, die die Login-Daten für meine Anwendung (nichts Phantasie) halten wird. Die App ist mit mehreren Tabellenansichten eines Navigationscontroller gemacht, aber ich habe Probleme rund um das Objekt Person zu teilen.

Versuche ein statisches Objekt wie folgt zu erstellen:

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

Und hier ist der Header

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

Diese Aufgabe Getter und Setter sind in verschiedenen Teilen der Anwendung benötigt werden. Ich habe versucht, sie wie folgt zugreifen

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

Alles funktioniert gut auf dem Login-Bildschirm, aber es stirbt bei der nächsten Verwendung. in der Regel EXC_BAD_ACCESS (eek!).

Klar mache ich etwas sehr falsch hier. Gibt es einen einfacheren Weg, um Objekte zwischen verschiedenen einer Anzahl View-Controller zu teilen (beide codiert und xib)?

War es hilfreich?

Lösung

Warum nicht speichert diese Informationen in den NSUserDefaults oder Keychain?

Andere Tipps

Ihre +sharedInstance Methode gibt nil, wenn es die gemeinsame Instanz zurückkommen sollte. Auch ich bezweifle, dass es jeder beliebige Wert ist auf diesem Block zu synchronisieren. Das Verfahren geschrieben mehr werden könnte einfach:

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

Beachten Sie, dass dies nicht ein ‚statisches Objekt‘, schafft da ist es nicht so etwas in Objective-C; es weist nur ein Objekt in einer statischen Variablen (wahrscheinlich das, was Sie wollen, aber wollte nur um sicher machen).

Eine andere Möglichkeit, ein Objekt zwischen zwei oder mehreren View-Controller innerhalb einer Navigationssteuerung zu teilen, ist eine Eigenschaft zu den verschachtelten View-Controller hinzuzufügen, und die Setter-Methode aufrufen, bevor die Navigation. Zum Beispiel könnten Sie eine Eigenschaft hinzufügen, wie folgt:

@property (nonatomic, retain) Book *book;

, um ein Kind der Root-Ansicht-Controller und eine -setBook: Nachricht in der Stammansicht Controllers -tableView:didSelectRowAtIndexPath: Methode senden.

Sie verwenden nicht die gemeinsame Instanz Muster korrekt. Ihre sharedInstance Methode sollte Alloc und init eine neue Person (wenn es nicht schon einmal geschehen ist) und weist es die sharedInstance statischen Variablen.

Wenn Sie dann einen Zeiger auf die Person benötigen, sollten Sie die gemeinsame Instanz-Klasse-Methode verwenden, nicht alloc und init eine neue Instanz selbst.

Aus technischen Sicht, wenn Sie für einen vollständigen geblasenen Singleton, Ihre alloc Verfahren gehen sollten nicht zulassen, dass Sie eine neue Instanz einer Person erstellen.

Auch ich nur den Code neu zu lesen, und kam über ein bisschen ein WTF:

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

Was ist denn das? Das ist ein Speicherleck, genau dort.

Alle Ihre Probleme können durch das Ersetzen jegliche und alle Linien von Person *thePerson = [[Person alloc] init]; mit Person *person = [Person sharedInstance]; gelöst werden

Ihre init ist hinky, wenn Sie den Vornamen der Person tut es wie folgt

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

den Namen raus,

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

Das wird in jeder Klasse arbeiten, die "Person.h"

#imports
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top