常量的吸气剂和二传手?

时间:2013-04-06 02:44:00

标签: ios objective-c singleton constants getter

是否可以为常量创建getter和setter?我想直接引用一个常量,如果它的值为nil,则让它自己实例化。一个常量声明如下:

// 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];

这可能吗?

编辑编辑了类方法的方法

3 个答案:

答案 0 :(得分:2)

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

但是,当你发送这样的消息时

[kThing doSomething];

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

[[MyClass kThing] doSomething];

MyClass的内部方法,你可以写

[[[self class] kThing] doSomething];

另一个注意事项是,当你实现这样的访问器方法时,你应该使支持变量保持静态,而不是extern。这将确保其他模块无法绕过您的getter访问这些变量。

答案 1 :(得分: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];

答案 2 :(得分:1)

简短的回答是,这是不可能的。

MyClass * const kThing = nil;

表示kThing是一个常量指针,这意味着它指向的内存中的地址无法更改。因此,一旦将其设置为nil,就无法将其设置为新对象。