一種替代單例的編程技巧

   單例對象通常是用來保存公共狀態和方法的。它是全局的,一旦建立,一直駐留內存。
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];
相關文章
相關標籤/搜索