如何保存变量并从两个不同的类中使用它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的主要内容,如果未能解决你的问题,请参考以下文章