2010-11-06 40 views
2

這個問題可能以前已經問過,所以我很抱歉。從另一個類訪問變量 - Objective-C

我正在研究一個iPhone應用程序,可以說我在class1中有一個變量var。我想在class2中添加一個UIButton,當它將var重置爲0時,var值在應用程序關閉時保存,所以當視圖加載var時賦值爲(我假設你們可以計算出這個值,將澄清代碼)。 我該如何寫這樣的東西?這裏基本上是我的嘗試:

@interface Class1 { 
    double var; 
} 
-(void)resetVar; 
@end 

@implementation Class1 
-(void)viewDidLoad { 
    NSUserDefaults *loadCount = [NSUserDefaults standardUserDefaults]; 
    var = [loadNoCount doubleForKey:@"count"]; 
} 
-(void)resetVar { 
    [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"count"]; 
    var = 0; 
} 


@interface Class2 { 
    Class1 *classObj; 
} 
@property(nonatomic, retain) Class1 *classObj; 
-(IBAction)reset:(id)sender; 
@end 

@implementation Class2 

-(void)viewDidLoad { 
    classObj = [[Class1 alloc] init]; 
} 
-(IBAction)reset:(id)sender { 
    [classObj resetVar]; 
} 
@end 
+0

我已經嘗試了setter方法爲好。在應用程序關閉並由於某種原因重新打開之後,var才能獲得該值? – Corey 2010-11-06 00:26:14

回答

1

使用setter方法-setVar:或要設置變量的類相似,您不能訪問其他對象的實例變量:它們都是通過私人默認。

0

您顯示的代碼片段的問題是NSUserDefaults只在應用程序退出時(或者也可能在iOS 4中將其發送到後臺時)將值寫入磁盤。如果您需要強制NSUserDefaults將密鑰的值寫入磁盤,請調用[[NSUserDefaults standardUserDefaults]同步]方法。

此外,而不是使用removeObjectForKey:在resetVar,爲什麼不使用setDouble:forKey:而不是?這樣你也可以擺脫Class1中的「double var」ivar,只需使用NSUserDefaults作爲數據存儲。

這裏有一點關於同步方法信息的,從NSUserDefaults的文檔:

因爲這個方法是每隔一段時間自動調用,使用此方法僅如果你不能等待自動同步(例如,如果您的應用程序即將退出),或者即使您未做任何更改,也希望將用戶的默認值更新爲磁盤上的內容。

這是我將如何實現你在你的代碼來描述:

@interface Class1 
{ 
} 
- (void)resetVar; 
@end 

@implementation Class1 
- (void)viewDidLoad 
{ 
    [self resetVar]; 
} 
- (void)resetVar 
{ 
    [[NSUserDefaults standardUserDefaults] setDouble:0.0 forKey:@"count"]; 
    [[NSUserDefaults standardUserDefaults] synchronize]; 
} 
@end 

@interface Class2 
{ 
    Class1 *classObj; 
} 
- (IBAction)reset:(id)sender; 
@end 

@implementation Class2 
- (void)dealloc 
{ 
    [classObj release]; 
} 
- (void)viewDidLoad 
{ 
    classObj = [[Class1 alloc] init]; 
} 
- (IBAction)reset:(id)sender 
{ 
    [classObj resetVar]; 
} 
@end