最好的“初始化”方法来设置iOS 7的variables值?

Objective C还是比较新的,请耐心等待:

我的应用程序有一个委托,一个导航控制器和一个视图。 我也使用一个单身的“全球”variables。

我知道我可以做到这一点,但似乎不好看:

#import "GlobalData.h" @synthesize ... NSInteger junk; NSInteger moreJunk; -(void)myMethod{ GlobalData *globDat=[GlobalData getSingleton]; junk=globDat.someValue; } -(void)myOtherMethod{ GlobalData *globDat=[GlobalData getSingleton]; moreJunk=globDat.someOtherValue; } 

我想这个,但不能:

 #import "GlobalData.h" @synthesize ... NSInteger junk; NSInteger moreJunk; GlobalData *globDat=[GlobalData getSingleton]; //Compiler won't allow this line -(void)myMethod{ junk=globDat.someValue; } -(void)myOtherMethod{ moreJunk=globDat.someOtherValue; } 

但是我可以这样做:

 #import "GlobalData.h" @synthesize ... NSInteger junk; NSInteger moreJunk; GlobalData *globDat; - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil{ self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { // Custom initialization globDat=[GlobalData getSingleton]; } return self; } -(void)myMethod{ junk=globDat.someValue; } -(void)myOtherMethod{ moreJunk=globDat.someOtherValue; } 

那么,是否有一个标准/通用/适当的“init”方法用于所有类?

我应该在每个class级都做这个吗?

 -(id)init{ if(self=[super init]){ globDat=[GlobalData getSingleton]; } return self; } 

我知道我可以做到这一点,但似乎很难…

你似乎在问如何取消你从单身中获取你想要的值的部分。 要做到这一点,最好的办法是首先消除单身人士。

你说你有一个应用程序委托,一个导航控制器和一个视图。 你可能也有一个视图控制器。 如果这些是应用程序中的主要对象,那么可以考虑将数据存储在视图控制器中。 或者,将你的单例转换成一个合法的数据模型,让你的视图控制器在一个属性中保存对它的引用。 那么你可以这样说:

 -(void)myMethod{ junk = self.model.someValue; } 

这与你似乎所要求的非常接近。

这取决于你将使用GlobalData多less。

在许多方法中广泛使用

如果你打算在你的类中广泛使用GlobalData (在许多方法中),那么你最好在你的.h添加@propertu (nonatomic, readwrite, weak)GlobalData *globalData@propertu (nonatomic, readwrite, weak)GlobalData *globalData (或者更好的方法是在类扩展中)。 在你的主要init...方法中,你设置值self.globalData = [GlobalData getSingleton]; 。 你也可以像你一样做,在你的.h或类扩展中使用实例variablesGlobalData* myGlobalData

确保你的init...方法从init开始,并确保有一个“主” init...方法(我们称之为“指定初始化程序”)。 你可以简单地覆盖NSObjectinit方法。 但是,如果你需要,你可以定义

 - (id)initWithString:(NSString*)str { self = [super init] ; // or another one ; here you should use the designated init. of the parent class if (self){ self.string = str ; self.globalData = [GlobalData getSingleton] ; } return self; } 

在几种方法中广泛使用

如果您以一种或两种方法密集使用GlobalData ,则不需要这样做。 你只需要定义一个局部variablesGlobalData * globalData = [GlobalData getSingleton]; 并使用它。

你提出的第三个代码不是面向对象的。

我不是100%确定你的问题是真正的(singletons作为常见的模式vs普通的-init方法?),但是为你的类创build所谓的指定初始化器是很常见的。 如果你不使用单例模式,那么带有值的init方法签名可能如下所示:

 -(id)initWithValue:(NSString*)newValue; 

至于使用单例模式来提供对variables的访问,我会推荐一个更松散耦合的方法,特别是如果单例类pipe理的值的数量开始增长的话。 我会把这些variables放到它们自己的类中(逻辑上分开),并根据需要将它们传递给构造函数或实例化它们。 这是一个意见/哲学问题,虽然。

我最终使用这个来解决这个问题。 (同样,我主要是试图清除代码的冗余)在我的类模块中,我做了以下几点:

 #import "GlobalData.h" GloablData *globDat; -(id)init{ if(self=[super init]){ globDat=[GlobalData getSingleton]; } return self; } ... -(void)someMethod{ int junk=globDat.junkvalue; }