Глобальные переменные в Objective-C - разница в объявлении extern и top файла .m - PullRequest
10 голосов
/ 19 декабря 2010

Я знаю, что вы можете определить глобальную переменную в Objective-C, используя "extern", но я только что понял, что переменные, которые я объявил в верхней части моего файла .m до моего первого метода, также были случайно глобальными вызывало некоторые проблемы). Я переместил их в часть @interface моего заголовочного файла, который, как мне кажется, правильно объявляет их существующими только внутри класса, что решило некоторые из моих проблем, но я все еще немного сбит с толку.

Какая разница в объявлении переменной как внешней и в начале файла .m? Или это приводит к тому же самому?

1 Ответ

25 голосов
/ 19 декабря 2010

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

Что делает переменную глобальной, это позиция ее объявления в файле. Если бы вы объявили переменную вне @interface в файле заголовка класса, вы бы объявили переменную, которая является общей и видимой для всех экземпляров вашего класса, а также для всех, кто #import заголовка. Если бы вы (и, очевидно, сделали) объявить переменную вне @implementation в файле .m вашего класса, вы бы также объявили переменную, которая является общей для всех экземпляров вашего класса, но не видна никому, кто # импортирует ваш заголовок.

Итак, используйте позицию объявлений переменных для определения области видимости. Вы только определите этих глобальных переменных в одном месте. Для всех других мест, которые вы объявляете для них , добавьте к объявлению префикс extern, чтобы сделать код читаемым, ваши намерения ясными и чтобы вы не попытались определить его снова.

...