Статическая строковая переменная в Objective C на iphone

Как создать и получить доступ к статической строке в iPhone (цель c)? Я объявляю static NSString *str = @"OldValue" в classе A.

Если я присвою это значение classу B как str = @"NewValue" . Это значение сохраняется для всех методов classа B. Но если я получаю доступ к нему в classе C (после присвоения в B), я получаю его как OldValue. Я что-то упускаю? Должен ли я использовать extern в других classах?

Спасибо и привет, Йогини

Обновление: с Xcode 8 Objective-C имеет свойства classа. Заметьте, это в основном синтаксический сахар; эти свойства не автосинтезируются, поэтому реализация в основном не изменилась по сравнению с предыдущим.

 // MyClass.h @interface MyClass : NSObject @property( class, copy ) NSString* str; @end // MyClass.m #import "MyClass.h" @implementation MyClass static NSString* str; + (NSString*) str { return str; } + (void) setStr:(NSString*)newStr { if( str != newStr ) { str = [newStr copy]; } } @end // Client code MyClass.str = @"Some String"; NSLog( @"%@", MyClass.str ); // "Some String" 

См. WWDC 2016 Что нового в LLVM . Часть свойства classа начинается с отметки в 5 минут.

Оригинальный ответ:

Objective-C не имеет переменных classа, которые, как я думаю, вы ищете. Вы можете подделать его со статическими переменными, как вы это делаете.

Я бы порекомендовал статический статический NSString в файле реализации вашего classа и предоставил методы classа для доступа к нему. Что-то вроде этого:

 // MyClass.h @interface MyClass : NSObject { } + (NSString*)str; + (void)setStr:(NSString*)newStr; @end // MyClass.m #import "MyClass.h" static NSString* str; @implementation MyClass + (NSString*)str { return str; } + (void)setStr:(NSString*)newStr { if (str != newStr) { [str release]; str = [newStr copy]; } } @end 

В отличие от Java, где статическая переменная предназначена для всех экземпляров classа, static в C означает, что переменная доступна только из файла, в котором она объявлена. Он позволяет делать такие вещи, как объявлять статическую переменную внутри функции, которая устанавливает значение только в первый раз, например .

Одна вещь, о которой вы не упоминали, – это отношения между classами A, B и C. Если они находятся в иерархии наследования, и вы ожидаете, что статическая переменная наследуется, как в Java, метод, описанный zpasternack, будет работать.

Если три classа не связаны друг с другом, и вы просто хотите получить доступ к значению, объявленному в A, то extern – более подходящий способ. В этом случае вы хотите объявить переменную как extern в ClassA.h, а затем определить ее в Class.m. Пока ClassB и ClassC импортируют ClassA.h, они смогут ссылаться на одно и то же определение extern.

Один из тонких моментов заключается в том, что вместо использования extern сам по себе более OBJC_EXPORT использовать OBJC_EXPORT , который определен в objc-api.h и обрабатывает компиляцию под C ++. Вот пример кода:

 // ClassA.h OBJC_EXPORT NSString* commonString; ... // ClassA.m NSString* commonString = @"OldValue"; // ClassB.m #import "ClassA.h" ... commonString = @"NewValue"; // Can be inside a function or method 

Разумеется, использование внешних переменных таким образом создает печально известную, злокачественную глобальную переменную , которая является хрупкой, поскольку любой может ее читать или писать, а доступ неконтролируемый. Это простой подход и отвечает на ваш вопрос об использовании static vs. extern . Однако, как принцип проектирования, инкапсуляция, обеспечиваемая путем переноса переменной с помощью методов classа, намного безопаснее, хотя и более сложна. В объектно-ориентированных языках, когда эффект, который вы пытаетесь достичь, относится к classу-статическому методу, инкапсуляция, вероятно, является правильным путем.

  • Количество слов в строке Swift для вычисления количества слов
  • Как можно угадать кодировку строки в Perl?
  • sizeof в c ++, показывающий размер строки один меньше
  • Заменить специальные символы в XSLT
  • История за названием «String»
  • Почему исключение «#include » только иногда приводит к сбоям компиляции?
  • Самый простой способ разобрать строку с разделителями-запятыми на какой-то объект, который я могу пропустить, чтобы получить доступ к отдельным значениям?
  • Проверить, что точка (x, y) находится между двумя точками, нарисованными по прямой
  • Преобразование строки в имя переменной или тип переменной
  • Разделить NSString для доступа к одной конкретной части
  • Операторы string.Equals () и == действительно одинаковы?
  • Давайте будем гением компьютера.