从旧式结构转向类

时间:2013-03-13 08:15:58

标签: ios objective-c

我知道这可能是一个菜鸟问题,但我有点被困在这里。我通常使用以下内容来访问不同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中提供数据吗?如果可以,请给我一些例子。

5 个答案:

答案 0 :(得分:1)

当您在结构中使用extern时,任何对象都会更新相同的值。

在OOPS中,全局变量永远不会说好,所以你需要使用单例模式。

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

答案 1 :(得分:1)

您有两个选择

  1. 使用单件类 - 请参阅Objective C Singleton
  2. 在App委托中声明属性 - 请参阅SO
  3. 您可以使用以下方式从任何课程访问应用代理:

    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