为iOS 7设置变量值的最佳'init'方法?

时间:2014-03-24 17:46:24

标签: ios objective-c

我仍然对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;
}

4 个答案:

答案 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;
}