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

时间:2012-04-26 19:59:12

标签: objective-c variables

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

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]];

}

Settings.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类中访问变量。

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

4 个答案:

答案 0 :(得分:0)

你有很多设计选择:

  1. 创建全局System对象;

  2. System班级设为Singleton;

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

  4. 现在实例化System并将其作为初始化参数传递给其他两个类。

  5. 现在,更详细:

    (1)声明:

         extern System* globalSystemObject;
    
    <{1>}中的

    ;然后定义:

    System.h
    static System* globalSystemObject = nil; 中的

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

    globalSystemObject

    这样做,您可以使用导入globalSystemObject = [[System alloc] init]; 的任何文件中的globalSystemObject

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

    (3)你的班级可能如下:

    System.h

    您可以通过静态变量(例如1)在.m文件中实现这些变量。

    (4)这非常简单。唯一的事情是你必须在同一范围内创建 @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 实例和其他两个类的实例:

    System

    System* system = [[System alloc] init]; about_now* anow = [[about_now alloc] initWithSystemInstance:system]; ... 参数将存储在system的ivar(或属性)中。

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

答案 1 :(得分:0)

您需要一个指向System实例的指针。所以要访问成员变量:

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

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

但是说,最好通过方法隐藏访问权限:

- (int)getSchoolEndAtIndex:(int)index
{
    return school_end[index];
}

答案 2 :(得分:0)

在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的对象,首选使用属性。

答案 3 :(得分:0)

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

@interface系统:UIViewController {

float length_of_one_hour; // ... @property(nonatomic,assign); .. @end

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