在Singleton中用自己的setter覆盖属性
我有一个类ViewController.m
我想要设置我的其他类Singleton.m
应该自动保存到NSUserDefaults
。
我认为我必须在Singleton.m
读取属性并覆盖setter,但是这是最好的方法吗? 如果是,我该怎么做?
使属性为只读没有太大的意义(如果我正确理解你的问题)。 你可能想要的是:
- 重写
init
方法以在实例化单例时从用户默认值加载属性, - 当设置一个新值时,覆盖默认设置器以将属性值保存为用户默认值。
例如: 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
。)