Ios 从老式结构迁移到类
我知道这可能是一个noob问题,但我在这里有点结巴。为了访问不同ViewController中的应用程序数据,我通常会执行以下操作:首先,我声明一个如下的global.h模块 全球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中声明结构,以便访问数据 @
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