我有一个名为“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类中访问变量。
希望有人可以帮助我。谢谢
答案 0 :(得分:0)
你有很多设计选择:
创建全局System
对象;
将System
班级设为Singleton;
定义System
类接口,以便它在类级别(对象级别)为其“属性”提供访问器方法。
现在实例化System
并将其作为初始化参数传递给其他两个类。
现在,更详细:
(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];