在Singleton中使用自己的setter覆盖属性

时间:2014-01-08 12:19:02

标签: ios iphone objective-c cocoa-touch

我有一个班级ViewController.m我要设置其他班级Singleton.m的属性,该属性应自动保存到NSUserDefaults

我想我必须在Singleton.m中只读取属性并覆盖setter,但这是最好的方法吗?如果是,我该怎么做?

1 个答案:

答案 0 :(得分:2)

将属性设置为只读没有多大意义(如果我正确理解您的问题)。你可能想要的是:

  • 覆盖init方法,以便在用户默认值时加载属性 单例实例化,
  • 覆盖默认的 setter ,以便在设置新值时将属性值保存为用户默认值。

示例: Singleton.h:

#import <Foundation/Foundation.h>

@interface Singleton : NSObject

+(instancetype)sharedSingleton;
@property (nonatomic) BOOL myBoolProp;

@end

<强> Singleton.m:

#import "Singleton.h"

@implementation Singleton

static NSString *kMyBoolPropKey = @"MyBoolProp";

+(instancetype)sharedSingleton
{
    static Singleton *sharedInstance;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedInstance = [[self alloc] init];
    });
    return sharedInstance;
}

-(id)init
{
    self = [super init];
    if (self) {
        _myBoolProp = [[NSUserDefaults standardUserDefaults] boolForKey:kMyBoolPropKey];
    }
    return self;
}

-(void)setMyBoolProp:(BOOL)myBoolProp
{
    _myBoolProp = myBoolProp;
    [[NSUserDefaults standardUserDefaults] setBool:myBoolProp forKey:kMyBoolPropKey];
}

@end

(注意两者

[[Singleton sharedSingleton] setMyBoolProp:...];
[Singleton sharedSingleton].myBoolProp = ...;

将调用自定义setter方法setMyBoolProp。)