我正在使用名爲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
所以,它不是一個真正的單例對象......你如何創建一個單例類/對象? –