1

是否可以为常量创建 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];

这可能吗?

编辑将方法编辑为类方法

4

3 回答 3

2

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

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

[kThing doSomething];

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

[[MyClass kThing] doSomething];

MyClass或者你可以写的内部方法

[[[self class] kThing] doSomething];

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

于 2013-04-06T02:52:11.020 回答
1

在其他文件中声明全局变量在 Objective 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];
于 2013-04-06T02:50:56.970 回答
1

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

MyClass * const kThing = nil;

表示thatkThing是一个常量指针,表示它指向的内存地址不能改变。因此,一旦设置为nil,以后就不能将其设置为新对象。

于 2013-04-06T02:56:11.037 回答