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

Ed *_*rty 3 const objective-c

我已经多次尝试过了解const关键字,但它对我来说并不合适.

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

extern MyClass *use_this_object;
Run Code Online (Sandbox Code Playgroud)

并在.m文件中:

MyClass *use_this_object;

+ (void) Initialize {
  use_this_object = [MyClass new];
}
Run Code Online (Sandbox Code Playgroud)

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

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

Rob*_*ier 8

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

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

NSString * const kMyString = @"string";
Run Code Online (Sandbox Code Playgroud)

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

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

+ (Something *)something {
  static Something *something = nil;
  if (! something) {
      something = [Something new];
  }
  return something;
}
Run Code Online (Sandbox Code Playgroud)

对于除真正常量之外的其他东西(如字符串和整数),最好还使用全局变量.

你应该确保它Something是不可变的.

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