Так что очень потерян при инициализации const объектов - PullRequest
3 голосов
/ 17 августа 2011

Я много раз пытался понять ключевое слово 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 ]

8 голосов
/ 17 августа 2011

В Objective-C не существует такого понятия, как «константный объект». Есть const указатели и есть неизменные объекты. Вы говорите о константном указателе на неизменный объект, но вы не можете выделить его во время выполнения.

Для объектов, которые могут быть выделены во время компиляции (а я знаю только один, NSString), вы можете сделать это:

NSString * const kMyString = @"string";

Это постоянный указатель на (неизменяемый) NSString. Вы читаете эти вещи справа налево.

Чтобы создать то, что вы хотите, вам нужна функция или метод с внутренним static, подобным этому:

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

Это предпочтительнее, чем использовать глобальные переменные в любом случае для вещей, отличных от истинных констант (таких как строки и целые числа).

Вы должны убедиться, что Something является неизменным.

РЕДАКТИРОВАТЬ Просто примечание о вышеуказанном коде. Это всего лишь пример того, как создать статический объект во время выполнения. Есть много способов сделать это с различными компромиссами, включая использование +initialize со статическим файлом (который в настоящее время является моим предпочтительным способом создания синглтона). Не воспринимайте приведенный выше код как единственный способ. Это просто способ, который ближе всего к const, потому что никакая другая часть программы не может напрямую попасть к указателю.

2 голосов
/ 17 августа 2011

Я бы использовал статический метод, кажется, намного проще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...