單例對象通常是用來保存公共狀態和方法的。它是全局的,一旦建立,一直駐留內存。
atom
我在開發項目的過程當中,發現了另外一種不一樣的機制,一樣能達到單例的效果。spa
原理說明:用本地存儲狀態值來模擬駐留內存效果。設計
某些語言內存管理採用自動回收機制,形成單例沒法保存狀態值,由於單例對象總會被清理。code
我設計了一種DataModel,它能夠將屬性保存到本地,也能夠從本地恢復屬性。這樣也能達到單例的效果。orm
@interface MyDataModel : NSObject @property (nonatomic, strong) NSString *test1; @property (nonatomic, strong) NSString *test2; - (void)writePropertyToLocal; - (void)getProperty; - (NSString *)getAllString; @end @implementation MyDataModel - (void)writePropertyToLocal { NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; if (self.test1 != nil) { [userDefaults setObject:self.test1 forKey:@"Test1"]; } if (self.test2 != nil) { [userDefaults setObject:self.test2 forKey:@"Test2"]; } [userDefaults synchronize]; } - (void)getProperty { NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; self.test1 = [userDefaults objectForKey:@"Test1"]; self.test1 = [userDefaults objectForKey:@"Test2"]; } - (NSString *)getAllString { return [[NSString stringWithFormat:@"%@%@", self.test1, self.test2]; }
使用方法演示:對象
//外部類1 MyDataModel *dataModel = [[MyDataModel alloc] init]; dataModel.test1 = @"狀態1"; dataModel.test2 = @"狀態2"; [dataModel writePropertyToLocal]; //外部類2 MyDataModel *dataModel = [[MyDataModel alloc] init]; [dataModel getProperty]; NSString *titleString1 = dataModel.test1; NSString *titleString2 = dataModel.test2; NSString *totalString = [dataModel getAllString];