0

我知道这可能是一个菜鸟问题,但我有点卡在这里。我通常会在不同的 ViewController 中访问应用程序数据:首先我声明一个 global.h 模块,如下所示

全局.h

typedef struct {

    NSString *appName
    NSString *appVersion;

    bool mode;

} structApp;

extern structApp app;

之后,我在 MainViewController.h 中声明了结构,以便我可以访问数据

@implementation ViewController

structApp app;

- (void)viewDidLoad
{
    app.appVersion = @"v1.02";
}

@end

然后我在每个 ViewController.h 中包含“global.h”

这样我就可以全局访问。据我所知,这是一个很好的实现,我已经在 20 多个应用程序中使用了它。当这个结构变大时,问题就开始了。在这些情况下,我会看到损坏的内存、之前加载数据的 nil 变量等。

有没有更好的方法让所有 ViewController 中的数据都可用?如果可以的话,请给我一些例子。

4

5 回答 5

1

正如您extern在结构中使用的那样,任何对象都会更新相同的值。

在 OOPS 中,全局变量永远不会说好,因此您需要使用单例模式。

创建一个在你的结构中包含所有这些东西的单例/共享类并使用它。

于 2013-03-13T08:24:32.563 回答
1

你有两个选择

  1. 使用单例类 - 参考Objective C Singleton
  2. 在 App 委托中声明属性 - 请参阅SO

您可以使用以下方式从任何类访问应用程序委托:

AppDelegate *appDel = [[UIApplication sharedApplication] delegate];
于 2013-03-13T08:27:02.303 回答
0

只有在处理原始数据时才应该处理 struct(如果您采用 OOP 方式)。

  app.appVersion = @"v1.02";

使您的结构指向悬空指针,因为您指向函数范围内的数据(app.appVersion 仅保存指针,而不保存数据)。因此,您必须保留所有这些对象值以使其内容安全,但我必须承认它仍然是一种 Q&D 方法。

如果您需要对数据进行全局访问,则可以使用单例,前提是您确实需要对数据进行强封装和控制。

如何制作单例 我的 Objective-C 单例应该是什么样子?

您也可以使用宏,这样您就可以使用常量字符串而不必担心数据持久性,因为它们将始终在您处理的范围内可用。

于 2013-03-13T08:27:27.363 回答
0

一般来说,使用 struct 应该可以正常工作。使用它们没有任何问题。如果您观察到由重叠内存或非法重用它引起的奇怪值,那么您的问题出在其他地方,但原则上不在于使用结构。该extern声明可能会导致这样的问题。

从内存使用的角度来看,一个类也不过是一个结构。如果我是你,我会设计一个具有属性的类,在使用结构时你有成员。并以几乎相同的方式使用它们。

对于“全局变量”,我应用了单例模式。这基本上是一个具有类方法(前导 + 而不是 -)的类,它使该类的唯一实例可用。在该方法中,我检查类(对同一类的类内部静态引用)是否已经可用(!= nil)并实例化它。有时我为此使用初始化方法。初始化是一个objective-c典型的东西。在第一次使用该类时或之前,每个类(甚至是子类)只调用一次。将类变量实例化为单例但不能移植到其他编程语言的非常好的地方。

于 2013-03-13T08:36:27.060 回答
0

如果您只想读取数据并且不需要任何复杂的数据结构,您还可以使用设置文件,例如

设置.h

#define appName @"blabla"
#define appVersion @"1.01"
#define mode 1
于 2013-03-13T09:35:49.110 回答