Есть ли в Objective-C какие-то особые правила для объявления глобальных переменных в файлах .m? - PullRequest
1 голос
/ 20 декабря 2011

Прочитав этот пост , похоже, что определенные правила должны учитываться при объявлении глобальных переменных.

Поэтому я попытался объявить глобальные переменные в файле .m. Тем не менее, смысл кода не рад сделать это для меня. Например, скажем, у меня уже есть 2 строки в файле .m:

@ реализация ViewController
@synthesize abc, xyz;

Теперь я хочу добавить «BOOL isChecked;».

Если я наберу это ниже «@synthesize» (или просто между @implementation и @synthesize), смысл кода фактически предлагает мне ввести «bool» (нижний регистр), когда я набираю «BOOL». Если я наберу «BOOL» над «@implementation», то будет успешно предложено «BOOL».

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

Это заставляет меня чувствовать, что Objective-C не любит, когда мы объявляем глобальные переменные ниже @synthesize. Но мой вопрос почему? Я чувствую, что здесь может быть причина или Apple допустила ошибку.

Ответы [ 3 ]

5 голосов
/ 20 декабря 2011

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

Глобальные переменные не являются частью класса.Конечно, вы можете поместить их в блок @implementation, но они на самом деле не являются частью класса - они глобальны - поэтому они на самом деле не принадлежат им.

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

0 голосов
/ 21 декабря 2011

Objective-C не имеет переменных класса. Вы объявляете глобальную переменную C. Вот как я это делаю:

Объявление статической переменной C. В вашем случае:

static BOOL isChecked = NO;

Обратите внимание, что я его инициализировал. Обратите внимание, что он объявлен статическим, что ограничивает его видимость для файла .m, в котором он объявлен.

Если вам нужен глобальный объект, такой как массив, вам нужно его инициализировать:

static NSArray *myArray;

@implementation MyClass

+ (void)initialize {
    if (self == [MyClass class]) {
        myArray = [NSArray arrayWithObjects: ... ];
    }
}

@end

Обратите внимание на if (self == [MyClass class]) check. + initialize будет вызываться один или несколько раз. Один раз, когда MyClass используется впервые (например, вызов + alloc ). Возможно, снова, когда любой подкласс MyClass используется впервые. Отсюда проверка, чтобы увидеть, действительно ли вы инициализируете MyClass или его подкласс.

И, наконец, если вы хотите получить доступ к этой переменной за пределами кода, в котором она объявлена, создайте метод доступа:

+ (BOOL)isChecked {
    return isChecked;
}

Не открывайте глобальную переменную C, удаляя модификатор static . Это усложняет отладку, рефакторинг или повторную реализацию (что, если isChecked внезапно зависит от другого состояния, как вы можете изменить это, если оно непосредственно используется повсеместно в другом коде?)

0 голосов
/ 21 декабря 2011

То, что подсказывает справочная система IDE, не является абсолютным показателем того, что «любит» язык Objective C.Помещение глобальной переменной либо вне, либо внутри реализации класса генерирует эквивалентные скомпилированные результаты из компилятора Xcode Objective C без предупреждений.

Тем не менее, можно считать лучшим стилем кода размещение этих объявлений вне реализации класса, поскольку все глобальные переменные на самом деле имеют глобальную область, а не область класса.

Кроме того, вы можете захотетьприсвойте начальные значения вашим глобальным переменным, вместо того чтобы делать какие-либо предположения в вашем коде о том, что это может быть.

...