在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 。)