【问题标题】:Getters and setters for constants?常量的获取器和设置器?
【发布时间】:2013-04-06 02:44:00
【问题描述】:

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

这可能吗?

edit将方法编辑为类方法

【问题讨论】:

  • 您是否将kThing 声明为全局变量?如果是,为什么是 getter 和 setter 实例方法?
  • @drewmm 是的,我希望它是一个全局常量。我将其更改为类方法以使其更清晰。虽然我不确定它们应该是哪个类的成员......我只是用它作为一个例子。
  • 是时候查找常量这个词了.. ??

标签: ios objective-c singleton constants getter


【解决方案1】:

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

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

[kThing doSomething];

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

[[MyClass kThing] doSomething];

或者MyClass的方法里面你可以写

[[[self class] kThing] doSomething];

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

【讨论】:

    【解决方案2】:

    在其他文件中声明全局变量在 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];
    

    【讨论】:

    • 在任何地方使用 globale 都是非常危险的。导致链接器中出现一些可怕的隐式屏蔽和双符号
    【解决方案3】:

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

    MyClass * const kThing = nil;
    

    表示kThing是一个常量指针,表示它所指向的内存地址不能改变。所以一旦设置为nil,以后就不能再设置为新对象了。

    【讨论】:

      猜你喜欢
      • 2013-02-07
      • 1970-01-01
      • 2014-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-27
      相关资源
      最近更新 更多