Подтвердить что ты не робот

Глобальные переменные в Objective-C - различие во внешнем и верхнем конце объявления файла .m

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

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

4b9b3361

Ответ 1

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

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

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