为什么我的sharedInstance返回nil?

时间:2017-01-08 16:22:31

标签: ios objective-c

我的viewController有一个全局属性' notesArray",我想通过单例从AppDelegate获取它。

这是我的appViewController.h

#import <UIKit/UIKit.h>

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


@property (nonatomic, strong) NSMutableArray *notesArray;

+ (AppViewController*)sharedManager;

@end

这是我的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

我的应用程序工作正常,但我需要在NSUserDefaults中保存它的状态,所以在AppDelegate / applicationDidEnterBackground:我做

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

但问题是[AppViewController sharedManager].notesArray = nil。 我试图将断点设置为applicationDidEnterBackground:以及来自[AppViewController sharedManager] = nil的所有数据。

1 个答案:

答案 0 :(得分:0)

很少有观察结果:

  1. notesArray不是全局属性。它是AppViewController实例的属性。现在在#2中我们看到你打算成为一个单身人士,但是因为ObjC并没有真正有一个好方法来阻止别人创建这种类型的第二个对象,你确定你没有创建第二个副本例如通过在XIB中创建该类型的对象?这可能不是你的问题(见#3),但我只想涵盖所有基础。

  2. 您的sharedManager方法意味着您将AppViewController视为单身人士。这对于视图控制器来说是一件不寻常的事情。通常你会有几个视图控制器,单例将是他们共享的模型的一部分。更好的是,你只需给每个视图控制器一个指向具有这个数组的模型对象的指针,如果你需要第二个列表,一切都会正常工作。另外,为什么它被称为“经理”?它是一个视图控制器。

  3. 您是否已在调试器中逐步查看代码以查看发生了什么? notesArray在尝试使用applicationDidEnterBackground:时,notesArray有什么价值?我没有在您的代码中看到您初始化notesArray的任何内容。所以你只有一个指向对象的空指针(即nil可能是init)。你可能想在你的单身人士的类中添加一个NSMutableArray方法来创建一个notesArray实例,并在http://example.com/first.php?second=third 中记住它的地址?