2010-11-06 41 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