2017-01-08 4 views
0

Ich habe Viewcontroller mit einer globalen Eigenschaft ‚notesArray“, und ich möchte es von AppDelegate durch Singleton bekommen.Warum gibt sharedInstance null zurück?

Hier ist meine appViewController.h

#import <UIKit/UIKit.h> 

@interface AppViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> 
{ 
    NSMutableArray *notesArray; 
} 


@property (nonatomic, strong) NSMutableArray *notesArray; 

+ (AppViewController*)sharedManager; 

@end 

Hier ist meine AppViewController.m

@implementation AppViewController 

@synthesize notesArray; 

+ (AppViewController*)sharedManager { 
    static AppViewController *sharedManager; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     sharedManager = [[self alloc] init]; 
    }); 

    return sharedManager; 
} 
... 
@end 

Meine app funktioniert gut, aber ich muss in NSUserDefaults es ist Staat zu retten, so in AppDelegate/applicationDidEnterBackground: ich

machen
- (void)applicationDidEnterBackground:(UIApplication *)application { 
[[NSUserDefaults standardUserDefaults] setObject:[AppViewController sharedManager].notesArray forKey:@"savedNotes"]; 
[[NSUserDefaults standardUserDefaults] synchronize]; 
} 

Aber das Problem ist, dass [AppViewController sharedManager].notesArray = nil. Ich habe versucht, Breakpoint zu ApplicationDidEnterBackground: und alle Daten von [AppViewController sharedManager] = nil.

+4

Wo ist Ihr Code, der versucht, 'notesArray' zu initialisieren? Es wird "Null" sein, bis Sie ihm einen Wert zuweisen. – rmaddy

Antwort

0

Nur wenige Beobachtungen:

  1. notesArray ist keine globale Eigenschaft. Es ist eine Eigenschaft in Instanzen von AppViewController. Jetzt in # 2 sehen wir, dass Sie beabsichtigen, es ein Singleton zu sein, aber da ObjC nicht wirklich eine gute Möglichkeit hat, jemanden daran zu hindern, ein zweites Objekt dieses Typs zu erstellen, sind Sie sicher, dass Sie keine zweite Kopie erstellen z.B durch Erstellen eines Objekts dieses Typs in einer XIB? Das ist wahrscheinlich nicht dein Problem (siehe # 3), aber ich wollte nur alle Grundlagen abdecken.

  2. Ihre sharedManager Methode bedeutet, dass Sie AppViewController als Singleton sehen. Das ist eine ungewöhnliche Sache mit einem View-Controller. Normalerweise hätten Sie mehrere View-Controller und das Singleton wäre Teil des Modells, das sie teilen. Noch besser: Sie geben jedem View-Controller einen Zeiger auf das Modellobjekt mit diesem Array, und wenn Sie jemals eine zweite Liste benötigen, wird alles funktionieren. Warum heißt es auch "Manager"? Es ist ein View-Controller.

  3. Haben Sie Ihren Code im Debugger durchgegangen, um zu sehen, was vor sich geht? Welchen Wert hat notesArray, während Sie versuchen, es in applicationDidEnterBackground: zu verwenden? Ich sehe nirgends in Ihrem Code, dass Sie notesArray initialisieren. Sie haben also einen leeren Zeiger auf ein Objekt (d. H. notesArray ist wahrscheinlich nil). Sie wollten wahrscheinlich eine init-Methode zu Ihrer Singleton-Klasse hinzufügen, die eine NSMutableArray Instanz erstellt und ihre Adresse in notesArray speichert?

+0

Wenn Sie nicht sicher sind, wie Sie den Debugger verwenden, um zu sehen, was Ihr Programm macht, kann dieser Artikel, den ich vor einiger Zeit geschrieben habe, helfen: http://masters-of-the-void.com/book12.htm (Es ist Teil von ein größeres C-Tutorial, aber die Dinge, die Sie wissen müssen, um Ihren eigenen Code zu debuggen, sind die gleichen). Ich arbeite gerade daran, es zu aktualisieren, um einige verschobene UI-Elemente in neueren Xcode-Versionen zu behandeln. – uliwitness

+0

'sharedManager' könnte ein seltsames Singleton sein, aber es ist ein Singleton. Beachten Sie, dass es sich bei der Methode um eine Klassenmethode handelt. Der Fehler (basierend auf dem Code und den Beweisen im OP) ist, dass notesArray wahrscheinlich nicht initialisiert ist. – danh

Verwandte Themen