一种替代单例的编程技巧

   单例对象一般是用来保存公共状态和方法的。它是全局的,一旦创建,一直驻留内存。

我在开发项目的过程中,发现了另一种不同的机制,同样能达到单例的效果。

原理说明:用本地存储状态值来模拟驻留内存效果。

    某些语言内存管理采用自动回收机制,造成单例无法保存状态值,因为单例对象总会被清理。

   我设计了一种DataModel,它可以将属性保存到本地,也可以从本地恢复属性。这样也能达到单例的效果。

@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];


你可能感兴趣的:(ios,架构)