是否可以为常量创建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];
这可能吗?
编辑编辑了类方法的方法
答案 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
,就无法将其设置为新对象。