Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在Singleton中使用自己的setter重写属性_Ios_Iphone_Objective C_Cocoa Touch - Fatal编程技术网

Ios 在Singleton中使用自己的setter重写属性

Ios 在Singleton中使用自己的setter重写属性,ios,iphone,objective-c,cocoa-touch,Ios,Iphone,Objective C,Cocoa Touch,我有一个类ViewController.m,我想在其中设置另一个类Singleton.m的属性,该属性应自动保存到NSUserDefaults 我想我必须将Singleton.m中的属性设置为只读并重写setter,但这是最好的方法吗?如果是,我该怎么做?将属性设置为只读没有多大意义(如果我正确理解您的问题)。您可能想要的是: 当 singleton被实例化 当设置新值时,重写默认设置器以将属性值保存为用户默认值 示例:Singleton.h: #import <Foundation/

我有一个类
ViewController.m
,我想在其中设置另一个类
Singleton.m
的属性,该属性应自动保存到
NSUserDefaults


我想我必须将
Singleton.m
中的属性设置为只读并重写setter,但这是最好的方法吗?如果是,我该怎么做?

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

  • 当 singleton被实例化
  • 当设置新值时,重写默认设置器以将属性值保存为用户默认值
示例:Singleton.h:

#import <Foundation/Foundation.h>

@interface Singleton : NSObject

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

@end
#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

为什么要将其设为只读?因此,您必须使用自定义setter,而不能使用点符号点符号对于调用setter和getter来说,点符号只是语法上的糖分,没有理由有这样的限制。这正是我要寻找的,但是它说
\u myBoolProb
未声明,我应该用
myBoolProb
替换它。这样做会导致出现警告
本地声明隐藏实例变量
。哦,谢谢,我不知道。@user2414460:那么您的代码中可能有一个
@synthesis myBoolProb
。您可以删除该语句,因为新编译器会自动生成
@synthesis myBoolProb=\u myBoolProb
。我必须在.m文件中声明该属性吗?现在我把它放在了file@user2414460:没错。该属性在.h文件中声明,但它仍然表示_myBoolProp未声明(我删除了@synthesis)