如何保存变量并从两个不同的类中使用它Objective C

Posted

技术标签:

【中文标题】如何保存变量并从两个不同的类中使用它Objective C【英文标题】:how to save a variable and use it from two different classes Objective C 【发布时间】:2012-04-26 19:59:12 【问题描述】:

我有一个名为“System”的类,它包含一些变量和两个数组,我需要从其他两个应该能够读取和写入该变量的类中访问它 我是一个初学者,所以很可能我已经犯了一些错误。

系统.h

@interface System : UIViewController

float length_of_one_hour; 
float length_of_first_break;
float length_of_second_break;
float length_of_lunch_break;
float length_of_shortned_hour;
float school_begin;

int school_end[5];
float school_length[5]; 


About_now.m

- (void)read_school_end_monday

school_end_label.text=[NSString stringWithFormat:@"%i", school_end[0]];


设置.m

- (IBAction)set_school_end_monday

school_end[0]= [school_end_on_mondays_textfield.text intValue];


但是我不知道在 System.h 和 About_now.m 中写什么变量保存在 System 类中并且可以从任何地方访问。是的,我已经尝试过@public 和 extern。 顺便说一句,我需要为 school_end 设置一个数组,因为我将使用一个已经有效的函数来计算它(使用一个小时的长度以及学校实际开始的时间等),但我需要之后从 About_now 类中访问变量.

希望有人可以帮助我。谢谢

【问题讨论】:

您的About_now.m 中存在语法错误:分号前缺少右括号] 哦,是的,这是真的,但我实际上不再使用该代码了。我用的是你写的。它给了我那个错误信息。它唯一起作用的地方是 SystemModel 类本身。 【参考方案1】:

ios 应用程序中跨类共享数据的常用方法是遵循 singleton 模式。

SystemModel.h

#import <Foundation/Foundation.h>

@interface SystemModel : NSObject 
    @public
    float length_of_one_hour; 
    float length_of_first_break;
    float length_of_second_break;
    float length_of_lunch_break;
    float length_of_shortned_hour;
    float school_begin;

    int school_end[5];
    float school_length[5]; 

+(SystemModel*)instance;
@end

SystemModel.m

@implementation SystemModel
static SystemModel* _instance= nil;

+(SystemModel*)instance 
    @synchronized([SystemModel class]) 
        if (!_instance)
            [[self alloc] init];
        return _instance;
    
    return nil;


+(id)alloc 
    @synchronized([SystemModel class]) 
        return (_instance = [super alloc]);

    return nil;


-(id)init 
    self = [super init];
    if (self != nil) 
        // your init code
    
    return self;


@end

现在您可以像这样使用您的实例:

 float tmp = [SystemModel instance]->length_of_one_hour;

您还可以将实例变量转换为属性,并使用点语法。浮点数和数组无关紧要,但对于基于id 的对象,最好使用属性。

【讨论】:

感谢您的回答...我仍在努力让该实例在我的 About_now 类中工作,但出现错误提示其受保护 @ferdyyy 哦,是的,你是对的!我复制了您的定义,但忘记添加 @public 以使其可访问。请查看编辑。 非常感谢。有用。不幸的是,在德国这里是晚上,所以我需要睡觉。我明天要重写一切。再次感谢【参考方案2】:

你需要一个指向 System.Instance 的指针。所以要访问成员变量:

System* system = GetSystem();
system->school_end[0] = whatever();

这与通过结构指针访问成员完全相同。

但话说回来,通过方法隐藏访问是一个好习惯:

- (int)getSchoolEndAtIndex:(int)index

    return school_end[index];

【讨论】:

【参考方案3】:

你有很多设计选项可以做到这一点:

    创建一个全局System对象;

    System 类设为Singleton;

    定义System 类接口,以便它在类级别(相对于对象级别)为其“属性”提供访问器方法。

    照原样实例化System,并将其作为初始化参数传递给其他两个类。

现在,更详细地说:

(1) 声明:

     extern System* globalSystemObject;

System.h;然后定义:

static System* globalSystemObject = nil;

System.m。不要忘记在代码中的某处初始化globalSystemObject

globalSystemObject = [[System alloc] init];

这样做,您可以从任何导入System.h 的文件中使用globalSystemObject

(2) 查看here 了解有关实现单例类的详细信息。请记住,许多人建议不要使用 Singleton(如果它只是“隐藏”全局变量的一种方式)。在这种特定情况下,考虑到名为 System 的类的语义,我会说 Singleton 是您的最佳选择。

(3) 您的班级可能如下所示:

    @interface System : UIViewController
    
    +(float)length_of_one_hour;
    +(void)set_length_of_one_hour:(float)length;

    +(float)length_of_first_break;
    +(void)length_of_first_break:(float)length;

    ...
    @end

您可以通过像 1 中的静态变量在 .m 文件中实现这些变量。

(4) 这很简单。唯一的问题是您必须在同一范围内创建 System 实例和其他两个类的实例:

System* system = [[System alloc] init];
about_now* anow = [[about_now alloc] initWithSystemInstance:system];
...

system 参数将存储在 about_now 的 ivar(或属性)中。

这样做可以完全避免使用全局变量(即使是那些隐藏在 Singleton 掩码后面的变量)。

【讨论】:

System 作为一个全局对象会是什么样子? 对于未来的读者来说值得注意:使变量全局化通常是不受欢迎的,因为它使代码更难维护。维护及其相关成本是良好代码设计的一个重要(经常被忽视)目标(即。软件工程)。【参考方案4】:

您可以通过 getter/setter (@property / @synthesize) 公开系统实例变量,并将引用传递给其他类实例。

@interface 系统:UIViewController

浮点长度_of_one_hour; //... @property(非原子,分配); .. @结束

OtherClass other = [[OtherClass alloc] initWithSystem:sys]; 或与二传手 [其他 setSystem:sys];

【讨论】:

以上是关于如何保存变量并从两个不同的类中使用它Objective C的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法将两个或多个不同的类链接到一个类中(然后在向量上使用)?

java如何在一个普通的类中获取request对象

如何让我的 SQLite 数据库被保存并从不同的设备访问

C++ 类中的两个不同变量初始化。有啥不同?

在实现 Runnable 的类中获取上下文

如何导入和使用在另一个python程序的类中定义的变量?