Глобальные переменные в Cocoa/Objective-C?

Это работает также и проще

    inline fun <reified T> Gson.fromJson(json: String) : T = 
         this.fromJson<T>(json, T::class.java)
19
задан Chris Hanson 3 December 2008 в 20:39
поделиться

5 ответов

Глобальные переменные или одиночный элемент выполнят то же самое здесь. Оба могут использоваться для превращения 'ключевых' имен в Какао, которое не бросит ошибку компилятора, если оно будет написано c орфографическими ошибками в ошибку компилятора. Это - основная цель. Глобальные переменные немного легче, хотя видя, поскольку требуется меньше ввода.

Вместо того, чтобы делать это:

[myArray setObject:theObject forKey:MyGlobalVariableKeyName];

необходимо было бы сделать что-то вроде:

[myArray setObject:theObject 
            forKey:[[MySingletonVariableClass getInstance] myVariableKeyName];

Глобальные переменные значительно меньше вводят для того же эффекта.

18
ответ дан 30 November 2019 в 01:46
поделиться

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

Это - глобальная константа - глобальный в объеме, но постоянный и поэтому не плохо в том смысле, что глобальные переменные плохи.

, Чтобы показать, как глобальный константы являются распространенными, безопасными и многочисленными, рассмотрите эти примеры глобальных констант:

  • Каждый класс в Вашей программе
  • Каждый #define
  • Каждое перечисление
  • Почти каждое имя, объявленное Какао (исключая редкие глобальные переменные как NSApp).

единственное время, которое необходимо взволновать по поводу глобальных констант, - когда их названия являются слишком родовыми (они могут загрязнить глобальное пространство имен). Не используйте имена, которые, вероятно, будут конфликтовать с чем-либо (всегда используют префикс и всегда делают имя, определенное для задачи как NSKeyValueObservingOptionNew).

18
ответ дан 30 November 2019 в 01:46
поделиться

Только, чтобы быть ясной, рекомендация состоит в том, чтобы создать неизменный глобальные переменные вместо встроенных строковых констант (трудно для рефакторинга и никакое время компиляции, проверив) или #defines (никакое время компиляции, проверив). Вот то, как Вы могли бы сделать так...

в MyConstants.h:

extern NSString * const MyStringConstant;

в MyConstants.m:

NSString * const MyStringConstant = @"MyString";

затем в любом другом.m файле:

#import "MyConstants.h"

...
[someObject someMethodTakingAString:MyStringConstant];
...

Таким образом, Вы получаете время компиляции, проверяя, что Вы не написали строковую константу c орфографическими ошибками, можно проверить на равенство указателя, а не представить равенство в виде строки [1] в сравнении констант, и отладка легче, так как константы имеют строковое значение во время выполнения.

[1] В этом использовании, Вы по существу используете значения указателя в качестве констант. Это именно так происходит, на который те конкретные целые числа также указывают на строки, которые могут использоваться в отладчике

63
ответ дан 30 November 2019 в 01:46
поделиться

Постоянные globals, которые установлены во время компиляции и никогда не изменяются, приемлемы для меня. При твердом кодировании строки это - то же самое, просто скрытое компилятором. Я буду избегать изменяемого globals как чумы.

Помнят, сама Apple использует ту же технику. Многие константы, которыми я ожидал быть, определяют, на самом деле константы. Вы получите ошибки ссылки, если заголовки будут достижимы, но платформа не.

3
ответ дан 30 November 2019 в 01:46
поделиться

Это зависит от дизайна Вашего программного обеспечения. Предположим, что у Вас есть программное обеспечение управления заданием, и одно из Ваших "значений по умолчанию" является списком каталогов, в которых могут быть сохранены различные объекты.

Для каждого Job у Вас может быть storagefile участник, который является одиночным элементом, которые загружаются, пользователь предпочел местоположения при запуске.

Или у Вас мог быть член Storagefile вызываемого пользователя глобальной переменной Предпочтения. Все еще мог быть одиночный элемент, но действительно не имеет значения в этом случае.

Для меня сложные значения по умолчанию (десятки различных типов классов) должны находиться в их собственном "пространстве", доступном для моделирования.

Однако могут быть предпочтения, которые важны для того, как Задание является установкой так те, которые предпочтение должно быть сохранено в Объекте Job поэтому при открытии его в приложении другого пользователя, это работает, как предназначено.

Снова это зависит от Вашего дизайна.

0
ответ дан 30 November 2019 в 01:46
поделиться