Ios 从老式结构迁移到类

Ios 从老式结构迁移到类,ios,objective-c,Ios,Objective C,我知道这可能是一个noob问题,但我在这里有点结巴。为了访问不同ViewController中的应用程序数据,我通常会执行以下操作:首先,我声明一个如下的global.h模块 全球 typedef struct { NSString *appName NSString *appVersion; bool mode; } structApp; extern structApp app; 之后,我在MainViewController.h中声明结构,以便访问数据 @

我知道这可能是一个noob问题,但我在这里有点结巴。为了访问不同ViewController中的应用程序数据,我通常会执行以下操作:首先,我声明一个如下的global.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中的数据可用吗?如果可以,请给我一些示例。

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

在OOPS中,全局变量从来都不是好的,所以需要使用单例模式

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

您有两个选择

  • 使用单例类-参考
  • 在应用程序委托中声明属性-请参阅
  • 您可以使用以下命令从任何类访问应用程序委托:

    AppDelegate *appDel = [[UIApplication sharedApplication] delegate];
    

    只有在处理基本数据时(如果采用面向对象的方式),才应该处理struct

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

    如果您需要对数据进行全局访问,那么只有在您确实需要对数据进行强封装和控制时,才可以使用单例

    怎样做单身汉


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

    一般来说,使用struct应该可以很好地工作。使用它们没有什么错。如果您观察到由于内存重叠或非法重复使用而导致的奇怪值,那么您的问题出在其他地方,而不是原则上使用结构。
    extern
    语句可能导致这样的问题

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


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

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

    设置.h

    #define appName @"blabla"
    #define appVersion @"1.01"
    #define mode 1
    

    您可以使用Singleton pattern.tip:如果您将其包含在ProjectName-Prefix.pch文件中,则无需手动将其添加到每个文件中
    #define appName @"blabla"
    #define appVersion @"1.01"
    #define mode 1