Необъявленные ивары? - PullRequest
       2

Необъявленные ивары?

2 голосов
/ 16 сентября 2010

Я сталкивался с кодом Objective-C, который объявляет переменную прямо под строкой @implementation в файле .m, а не в блоке @interface файла .h. Затем он продолжает использовать его как частный ивар. Я не смог найти документацию по объявлению переменных таким образом и хотел бы знать, как это повлияет.

Пример:

.h

@interface MyClass {
    @private
    int _myPrivInt1;
}
@end

.m

@implementation
int _myPrivInt2;
@end

Вопросы:

В чем техническая разница между этими двумя переменными?

Это то же самое, что объявлять ivar в блоке .h @interface с помощью модификатора @private или это больше похоже на глобальную переменную C?

Есть ли какие-либо последствия при объявлении переменной таким образом?

Следует ли этого избегать?

Есть ли термин для объявления таких переменных, как _myPrivInt2, который сделал бы мой поиск в Google немного более успешным?

1 Ответ

3 голосов
/ 16 сентября 2010

Вы должны объявить переменные экземпляра в блоке интерфейса.

@implementation
int _myPrivInt2;
@end

Объявляя переменную таким образом, вы фактически не объявляете iVar для своего класса. _myPrivInt2 будет глобальной переменной, к которой можно получить доступ из любой части вашего кода, используя объявление extern:

// SomeOtherFile.m
extern int _myPrivInt2;
...
_myPrivInt2 = 1000;

Вы можете проверить - ваша переменная _myPrivInt2 будет равна 1000 после выполнения кода в SomeOtherFile.m.

Вы также можете указать статический спецификатор связи для вашего _myPrivInt2, чтобы он был доступен только внутри текущей единицы перевода

@implementation
static int _myPrivInt2; // It cannot be accessed in other files now
@end
...