我正在使用名为CSAppData
的单例存储我的iPhone应用程序的数据。我将一个名为CSInbox
的对象存储在单例中。当我注销我的应用程序时,我想清除该对象的数据。安全地清除单身数据的最佳方法?
这是我的单代码,包括用于清除数据的方法:在我的视图控制器之一
- (id)init {
self = [super init];
if (self)
{
self.inbox = [[CSInbox alloc] init];
}
return self;
}
+ (CSAppData *)appData {
static CSAppData * appDataInstance;
@synchronized(self) {
if(!appDataInstance) {
appDataInstance = [[CSAppData alloc] init];
}
}
return appDataInstance;
}
+(void) clearData {
CSAppData *appData = [CSAppData appData];
appData.inbox = [[CSInbox alloc] init];
}
然而,在initWithCoder
方法,我存储在收件箱变量:
-(id) initWithCoder:(NSCoder *)aDecoder {
self = [super initWithCoder:aDecoder];
if(self) {
self.inbox = [[CSAppData appData] inbox];
}
return self;
}
因此,当应用程序注销并调用clearData
方法时,视图控制器仍然指向旧的CSInbox
对象。而且即使我初始化一个新的视图控制器,并将其设置为根视图控制器(在AppDelegate中),就像这样:
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
MainTabControllerViewController *viewController = (MainTabControllerViewController *)[storyboard instantiateViewControllerWithIdentifier:@"mainView"];
[self.window setRootViewController:viewController];
具有CSInbox
永远不会重新初始化,并且将一个子视图控制器依旧指向那个旧的CSInbox对象。 (我不知道为什么会发生这种情况。)
那么,解决这个问题的最好方法是什么?
- 更改
clearData
方法在单只重置CSInbox
对象的属性,而不是alloc和init和新的? - 将
self.inbox = [[CSAppData alloc] init];
移至视图控制器类中的viewDidLoad
,以便在第二次登录时正确设置它? - 更改
AppDelegate
中的注销功能,以便释放根视图控制器和所有其他视图控制器,以便它们在第二次登录时重新初始化?
我倾向于1号或3 ...
按照要求,这里是CSInbox.h:
@interface CSInbox : NSObject
@property (nonatomic,strong) NSMutableArray *threads;
@property (nonatomic, assign) NSInteger newCount;
@property (nonatomic,strong) NSDate *lastUpdate;
-(void) setThreadsFromJSON:(NSDictionary *)json;
@end
这里是CSInboxViewController.h:
@interface CSInboxViewController : UITableViewController <UITableViewDataSource, UITableViewDelegate, CSThreadViewControllerDelegate>
@property (strong, nonatomic) IBOutlet UITableView *inboxTableView;
@property (strong,nonatomic) CSInbox *inbox;
@end
and CSAppData.h:
@interface CSAppData : NSObject {
CSInbox *inbox;
}
@property(nonatomic,strong) CSInbox *inbox;
+ (CSAppData *)appData;
+ (void)clearData;
@end
所以,它不是一个真正的单例对象......你如何创建一个单例类/对象? –