2013-04-06 70 views
1

可以为常量创建getter和setter吗?我想直接引用一个常量,并且如果它的值为零,就让它自己实例化。声明如下常量:常量的吸气和吸气装置?

// Prefs.h 
extern MyClass * const kThing; 

// Prefs.m 
MyClass * const kThing = nil; 

和的getter/setter看起来像:

// getter 
+ (MyClass *)kThing 
{ 
    _kThing = _kThing ? : [MyClass new]; 
    return _kThing; 
} 

// setter 
+ (void)setKThing:(MyClass *)myClass 
{ 
    _kThing = myClass 
} 

然后我可以用它喜欢:

[kThing doSomething]; 

这可能吗?

编辑编辑的方法类方法

+1

你是否将'kThing'声明为全局变量?如果是这样,为什么getter和setter实例方法? – drewmm 2013-04-06 02:46:38

+0

@drewmm是的,我希望它是一个全球常数。我将其改为类方法以使其更清晰。虽然我不确定那些应该是哪些类的成员......我只是用它作为例子。 – zakdances 2013-04-06 02:48:49

+0

查找单词constant的时间.. ?? – Rob 2013-04-06 02:49:56

回答

1

全局变量声明在另一个文件是非常危险的客观C.理想的情况下,我们使用sharedInstance。试试这样:

在MyGame.h

@interface MyGame : NSObject 
{ 
    int mScore; 
} 
@property(nonatomic,assign) int score; 
+(MyGame*)sharedObject; 
-(void)someFunction; 
@end 

在MyGame.m

static MyGame *gGame = nil; 

@implementation MyGame 

@synthesize score = mScore; 

+(MyGame*)sharedObject 
{ 
    if(!gGame) 
    { 
     gGame = [[MyGame alloc] init]; 
    } 
    return gGame; 
} 

-(void)someFunction 
{ 

} 
@end 

要访问项目的任何地方:

 #import "MyGame.h" 

    [MyGame sharedObject].score; 
    [MyGame sharedObject] someFunction]; 
+1

在任何地方使用globale是非常危险的。导致链接器中出现一些可怕的隐式屏蔽和双重符号 – CodaFi 2013-04-06 03:16:02

2

你描述的不是常量,它们是全局变量。你不能为它们定义getter和setter,但是你可以使用它们的值返回类方法,这正是你所做的。

但是,当你发送邮件这样

[kThing doSomething]; 

全局变量,直接使用,绕过你消气。如果你想通过一个getter,你可以写

[[MyClass kThing] doSomething]; 

MyClass内部方法,你可以写

[[[self class] kThing] doSomething]; 

另外一个需要注意的是,当哟实现存取方法一样,你应该做的支持变量static,而不是extern。这将确保其他模块不能访问这些绕过你的getters的变量。

1

简而言之,这是不可能的。

MyClass * const kThing = nil; 

意味着kThing是一个常量指针,这意味着在存储器它指向的地址不能被改变。所以一旦它设置为nil,它不能以后被设置为一个新的对象。