因此在初始化const对象时非常失败

时间:2011-08-17 17:41:40

标签: objective-c const

我已多次尝试了解const关键字,但它对我来说无效。

我想声明一个无法更改的对象,也就是说,一个常量对象。例如,在.h文件中:

extern MyClass *use_this_object;

并在.m文件中:

MyClass *use_this_object;

+ (void) Initialize {
  use_this_object = [MyClass new];
}

现在,我在哪里可以放置一个const,以便其他类可以访问use_this_object但不能修改它(假设MyClass是不可变的),而MyClass类可以初始化变量?

这甚至可能吗?或者我应该使用静态方法来检索常量而不是将其声明为extern?

2 个答案:

答案 0 :(得分:8)

Objective-C中没有“const对象”这样的东西。有const 指针,并且有不可变对象。您正在谈论的是指向不可变对象的const指针,但您无法在运行时分配这些指针。

对于可以在编译时分配的对象(我只知道一个NSString),你可以这样做:

NSString * const kMyString = @"string";

这是一个指向(不可变)NSString的常量指针。你从右到左阅读这些东西。

要创建您想要的内容,您需要一个内部static的函数或方法,如下所示:

+ (Something *)something {
  static Something *something = nil;
  if (! something) {
      something = [Something new];
  }
  return something;
}

除了真正的常量(如字符串和整数)之外,最好还使用全局变量。

由您决定Something是不可变的。

编辑只是关于上述代码的说明。这只是如何在运行时创建静态对象的示例。有很多方法可以通过各种权衡来实现,包括使用+initialize和静态文件(目前我最喜欢创建单例的方法)。不要将上述代码作为一个唯一的方式。它只是最接近const的方式,因为程序的其他部分不能直接指向指针。

答案 1 :(得分:2)

我使用静态方法,看起来更简单。