如何更新一个类中的变量?

时间:2010-08-14 06:22:09

标签: iphone objective-c cocoa cocoa-touch macos

我需要在B类中设置一个B类变量。为了测试这个,我有一个在A类中运行的while循环,它通过NSLog连续打印变量。但是,无论我尝试什么,我都无法让B类更新A类中的变量,以便A类可以读取B类所做的更改。我很确定我已经在IB中正确连接了所有内容。以下是我设置的方法:

//Class A
@interface AppDelegate : NSObject {
    NSString *teststring;
}
@property(readwrite,nonatomic,retain) NSString *teststring;
@end

@implementation AppDelegate
@synthesize teststring;
-(id)init{
    self = [super init];
    if(self) {
        teststring = [[NSString alloc] init];
    }
    return self;
}
-(void)awakeFromNib
{
    while(1){
        NSLog(@"teststring is %@",teststring);
        usleep(500000);
    }
}
@end

//Class B
@class AppDelegate;
@interface otherClass : NSObject {
    AppDelegate *appdel;
}
-(IBAction)doTest:(id)sender;
@end

@implementation otherClass
-(void)awakeFromNib
{
    appdel = [[AppDelegate alloc] init];
}
-(void)doTest:(id)sender
{
    appdel.teststring = @"Test";
    NSLog(@"Set teststring to %@",appdel.teststring); //this works
}
@end

1 个答案:

答案 0 :(得分:2)

你正在考虑过多的课程(看似某种代码的“部门”),而对于对象却不够,你的措辞和问题都证明了这一点。

您的 {/ em> otherClass实例正在创建 {/ 1}}类的第二个实例。你已经有一个AppDelegate实例,它是实际的应用程序委托(因为,我认为,你的笔尖中有它,你可以将它连接到应用程序的AppDelegate插座);现在,在delegate,你正在创造另一个。

然后告诉第二个-[otherClass awakeFromNib]实例将其AppDelegate属性设置为teststring,然后向第二个@"Test"实例询问该属性的值,并且您的第二个AppDelegate实例会尽职尽责地向您显示您提供的价值。

第一个实例的AppDelegate属性没有相同的值,因为teststring对象从未为该实例赋予其otherClass属性的值。请注意,您在teststring部分中定义的变量是实例变量,这就是为什么类的不同实例可以并且通常在这些变量中具有不同值的原因。属性同样是每个实例,通常由这些实例变量支持。

@interface A(真实的应用程序委托,在nib中创建)和AppDelegate B(由AppDelegate对象创建,而不是任何代理)是{{1}的两个独立实例},带有单独的otherClass变量。

因此,解决方案:让AppDelegate实例与真正的应用程序委托对话,而不是它自己创建的teststring实例。您可以向应用程序询问其委托,或者(如果otherClass对象位于MainMenu nib中)为应用程序委托提供一个插座,就像应用程序一样。

然而,在应用程序委托类中堆积太多东西是糟糕的设计;每个类应该有一个特定的目的,并且通常应该整齐地适合Model,View和Controller分类之一。因此,假设您的AppDelegate对象应该是控制器,将属性移动到otherClass并使该对象成为任何需要该属性的控制器。