iphone - 如何从一个类中更新另一个类中的变量?

标签 iphone objective-c cocoa cocoa-touch macos

我需要在 B 类的 A 类中设置一个变量。为了测试这一点,我在 A 类中运行一个 while 循环,通过 NSLog 连续打印该变量。然而,无论我如何尝试,我都无法让 B 类以 A 类可以读取 B 类所做的更改的方式更新 A 类中的变量。我很确定我已在 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

最佳答案

您对类(看似代码的某种“部门”)考虑太多,而对对象考虑得不够,您的措辞和问题都证明了这一点。

您的 otherClass 实例创建了 AppDelegate 类的第二个实例。您已经有一个 AppDelegate 实例,它是实际的应用程序委托(delegate)(因为我假设您的 Nib 中有它,并且已将其连接到应用程序的 delegate 导出)那里);现在,在 -[otherClass awakeFromNib] 中,您正在创建另一个。

然后,您告诉第二个 AppDelegate 实例将其 teststring 属性设置为 @"Test",然后您询问第二个 AppDelegate 实例来获取该属性的值,而您的第二个 AppDelegate 实例会尽职尽责地向您显示您为其提供的值。

第一个实例的 teststring 属性值不同,因为 otherClass 对象从未为该实例提供 teststring 值> 属性(property)。请注意,您在 @interface 部分中定义的变量是实例变量,这就是为什么类的不同实例可以并且通常在这些变量中具有不同的值。属性同样是每个实例的,通常由这些实例变量支持。

AppDelegate A(真正的应用程序委托(delegate),在 Nib 中创建)和 AppDelegate B(由 otherClass 对象创建,而不是任何委托(delegate)) 是 AppDelegate 的两个单独实例,具有单独的 teststring 变量。

因此,解决方案是:让 otherClass 实例与真正的应用程序委托(delegate)通信,而不是与它自己创建的 AppDelegate 实例通信。您可以向应用程序请求其委托(delegate),或者(如果 otherClass 对象位于 MainMenu Nib 中)为其提供一个应用程序委托(delegate)的导出,就像应用程序一样。

但是,在应用程序委托(delegate)类中堆放太多内容是糟糕的设计;每个类都应该有一个特定的目的,并且通常应该完全适合模型、 View 和 Controller 分类之一。因此,假设您的 otherClass 对象应该是一个 Controller ,请将属性移动到 otherClass 中,并使该对象成为需要该属性的任何对象的 Controller 。

关于iphone - 如何从一个类中更新另一个类中的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3482283/

相关文章:

javascript - 适用于 iPhone 的极简主义可缓存 jQuery/javascript 库?

ios - 防止 UITableView 行被销毁

iphone - 使用调度机制时未单击 Tableview 单元格

macos - 当应用程序处于后台时, cocoa 计时器不会触发

iphone - ASIHTTPRequest-从相机胶卷上传文件

objective-c - 使用 `CGEventSourceSetLocalEventsSuppressionInterval` 而不是弃用的 `CGSetLocalEventsSuppressionInterval`

iphone - 发现 iOS 二进制文件的 iOS 版本

PHP - 处理从 iPhone 获取的垂直图像

ios - 如何在 UITableView 中设置 UILabel 的 Action

objective-c - 如何在 Cocoa 中构建 "editor"