我的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
的所有数据。
答案 0 :(得分:0)
很少有观察结果:
notesArray
不是全局属性。它是AppViewController
实例的属性。现在在#2中我们看到你打算成为一个单身人士,但是因为ObjC并没有真正有一个好方法来阻止别人创建这种类型的第二个对象,你确定你没有创建第二个副本例如通过在XIB中创建该类型的对象?这可能不是你的问题(见#3),但我只想涵盖所有基础。
您的sharedManager
方法意味着您将AppViewController
视为单身人士。这对于视图控制器来说是一件不寻常的事情。通常你会有几个视图控制器,单例将是他们共享的模型的一部分。更好的是,你只需给每个视图控制器一个指向具有这个数组的模型对象的指针,如果你需要第二个列表,一切都会正常工作。另外,为什么它被称为“经理”?它是一个视图控制器。
您是否已在调试器中逐步查看代码以查看发生了什么? notesArray
在尝试使用applicationDidEnterBackground:
时,notesArray
有什么价值?我没有在您的代码中看到您初始化notesArray
的任何内容。所以你只有一个指向对象的空指针(即nil
可能是init
)。你可能想在你的单身人士的类中添加一个NSMutableArray
方法来创建一个notesArray
实例,并在http://example.com/first.php?second=third
中记住它的地址?