我仍然对Objective C很新,所以请耐心等待:
我的应用有一个代表,一个导航控制器和一个视图。 我还使用Singleton for" global"变量
我知道我可以这样做,但似乎很笨拙:
#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"用于所有类的方法?
我应该在每个班级都这样做吗?
-(id)init{
if(self=[super init]){
globDat=[GlobalData getSingleton];
}
return self;
}
答案 0 :(得分:1)
这取决于您使用GlobalData
的费用。
如果您计划在课堂上广泛使用GlobalData
(在许多方法中),那么您最好添加
@propertu (nonatomic, readwrite, weak)GlobalData *globalData
中的.h
(或者,更好的,在课程扩展中)。在主init...
方法中,您可以设置值self.globalData = [GlobalData getSingleton];
。您也可以使用GlobalData* myGlobalData
或类扩展中的实例变量.h
来执行此操作。
确保您的init...
方法以init
开头,并确保存在“主”init...
方法(我们将其称为“指定初始值设定项”)。您只需覆盖init
的{{1}}方法即可。但是,如果需要,您可以定义
NSObject
如果您在一种或两种方法中集中使用- (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
并使用它。
您提出的第三个代码不是面向异议的。
答案 1 :(得分:1)
我知道我可以做到这一点,但似乎笨拙......
您似乎在问如何取消从单身人士中检索所需值的部分。最好的办法就是首先消除单身人士。
你说你有一个app delegate,一个导航控制器和一个视图。您可能还有一个视图控制器。如果这些是应用程序中的主要对象,则可以考虑将数据存储在视图控制器中。或者,将您的单例转换为合法的数据模型,并让您的视图控制器在属性中保留对它的引用。然后你可以这样说:
-(void)myMethod{
junk = self.model.someValue;
}
这与你似乎要求的非常接近。
答案 2 :(得分:0)
我不能100%确定您的问题是什么(单身作为常见模式与常见-init方法?),但通常为您创建所谓的指定初始值设定项类。如果您不使用单例模式,则采用值的init方法签名可能如下所示:
-(id)initWithValue:(NSString*)newValue;
至于使用单例模式来提供对变量的访问,我建议使用更松散耦合的方法,特别是如果单例类管理的值的数量开始增长。我会将这些变量放入它们自己的类中(逻辑上分开)并根据需要使用它们,方法是将它们传递给构造函数,或者实例化它们。但这是一个意见/哲学问题。
答案 3 :(得分:0)
我最终用它来解决这个问题。 (我再次主要是试图清理代码的冗余) 在我的课程模块中,我做了以下内容:
#import "GlobalData.h"
GloablData *globDat;
-(id)init{
if(self=[super init]){
globDat=[GlobalData getSingleton];
}
return self;
}
...
-(void)someMethod{
int junk=globDat.junkvalue;
}