我知道这可能是一个菜鸟问题,但我有点被困在这里。我通常使用以下内容来访问不同ViewControllers中的应用程序数据:首先我声明一个像这样的global.h模块
global.h
typedef struct {
NSString *appName
NSString *appVersion;
bool mode;
} structApp;
extern structApp app;
之后我在MainViewController.h中声明了struct,以便我可以访问数据
@implementation ViewController
structApp app;
- (void)viewDidLoad
{
app.appVersion = @"v1.02";
}
@end
然后我在每个ViewController.h中包含“global.h”
这样我可以全局访问。到目前为止,我可以看到这是一个很好的实现,我已经在20多个应用程序中使用它。当此结构的大小增加时,问题就开始了。在那些情况下,我看到损坏的内存,以前加载数据的零变量等等。
有一种更好的方法可以在所有ViewController中提供数据吗?如果可以,请给我一些例子。
答案 0 :(得分:1)
当您在结构中使用extern
时,任何对象都会更新相同的值。
在OOPS中,全局变量永远不会说好,所以你需要使用单例模式。
创建一个包含结构中所有这些东西并使用它的单例/共享类。
答案 1 :(得分:1)
您有两个选择
您可以使用以下方式从任何课程访问应用代理:
AppDelegate *appDel = [[UIApplication sharedApplication] delegate];
答案 2 :(得分:0)
只有在处理原始数据时才应该处理struct(如果你是以OOP方式)。
app.appVersion = @"v1.02";
使你的结构指向悬空指针,因为你将数据指向函数范围(app.appVersion只保存指针,而不是数据)。因此,您必须保留所有这些对象值才能使其内容安全,但我必须承认它仍然是Q& D方法。
如果您需要全局访问数据,只有在真正需要强大的封装和数据控制时才能使用单例。
如何制作单身人士 What should my Objective-C singleton look like?
您也可以使用宏,这样您就可以使用常量字符串而不必担心数据持久性,因为它们将始终可用于您正在处理的范围。
答案 3 :(得分:0)
一般情况下使用struct应该可以正常工作。使用它们没有任何问题。如果您观察到重叠内存或非法重复使用它导致的奇怪值,那么您的问题就在其他地方,但原则上不使用结构。 extern
声明可能导致此类问题。
从内存使用的角度来看,类也不仅仅是一个结构。如果我是你,我会设计一个具有属性的类,在使用结构时你有成员。并以相同的方式使用它们。
对于“全局变量”,我应用单例模式。这基本上是一个带有类方法的类(前导+而不是 - ),它使该类的唯一实例可用。在该方法中,我检查类(对同一类的类内部静态引用)是否已经可用(!= nil)并实例化它。有时我会使用initialize方法。初始化是一个客观的典型事物。在第一次使用类时或之前,每个类只调用一次,甚至是子类。一个非常好的地方,用于将类变量实例化为单例,但不能移植到其他编程语言。
答案 4 :(得分:0)
如果您只想阅读数据并且不需要任何复杂的数据结构,您还可以使用
等设置文件Settings.h
#define appName @"blabla"
#define appVersion @"1.01"
#define mode 1