最好的“初始化”方法来设置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...
方法(我们称之为“指定初始化程序”)。 你可以简单地覆盖NSObject
的init
方法。 但是,如果你需要,你可以定义
- (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; }