2014-01-08 66 views
0

我有一個類ViewController.m我想在其中設置我的其他類Singleton.m的屬性,該屬性應自動保存到NSUserDefaults在Singleton中用自己的setter覆蓋屬性

我想我必須使Singleton.m只讀屬性覆蓋setter,但這是最好的方法嗎?如果是的話,我該怎麼做?

+0

爲什麼使它只讀? –

+0

所以你必須使用自定義setter,而不能使用點符號 – user2414460

+0

點符號只是調用setter和getter的語法糖,沒有理由有這樣的限制。 – Abizern

回答

2

使屬性爲只讀沒有太大意義(如果我正確理解您的問題)。你可能想要的是:

  • 覆蓋的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 = ...; 

將調用自定義設置方法setMyBoolProp。)

+0

這正是我正在尋找的,但它說'_myBoolProb'未聲明,我應該用'myBoolProb'替換它。這樣做會導致我警告'本地聲明隱藏實例變量'。哦,謝謝,我不知道。 – user2414460

+0

@ user2414460:那麼你的代碼中可能有'@synthesize myBoolProb'。您可以*刪除*該語句,因爲新的編譯器會自動生成'@synthesize myBoolProb = _myBoolProb'。 –

+0

我是否必須在.m文件中聲明屬性?目前,我在.h文件中使用 – user2414460