从另一个类访问变量 - Objective-C

时间:2010-11-06 00:21:45

标签: objective-c ios4

之前可能已经提出过这个问题,所以我很抱歉。

我正在开发一款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

3 个答案:

答案 0 :(得分:1)

在要设置变量的类上使用setter方法-setVar:或类似方法。您无法访问其他对象的实例变量:默认情况下它们都是私有的。

答案 1 :(得分:0)

您要显示的代码片段的问题是NSUserDefaults仅在应用退出时将值写入磁盘(或者也可能在iOS 4中将其发送到后台时)。如果您需要强制NSUserDefaults将密钥的值写入磁盘,请在其上调用[[NSUserDefaults standardUserDefaults] synchronize]方法。

另外,不要在resetVar中使用removeObjectForKey:为什么不使用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

答案 2 :(得分:-1)

尝试使用单身http://developer.apple.com/library/mac/#documentation/General/Conceptual/DevPedia-CocoaCore/Singleton.html 如果你不能通过阅读来解决这个问题,请告诉我,我会做一个例子!