Поскольку вы не указали код, это только предположение: если вы объявляете глобальную переменную в файле Objective-) C, то скомпилированный двоичный файл будет иметь эту глобальную переменную как общедоступный символ. Если вы используете одно и то же имя для глобалов в разных файлах, а затем попытаетесь объединить скомпилированный двоичный файл в одно и то же приложение, вы получите дублируемую ошибку символа от связанного/загрузчика (ld
в вашей ошибке).
(Обратите внимание, что это не связано с видимостью двух переменных на уровне языка, не предпринимая шагов, чтобы сделать видимыми переменные при компиляции файла, компилятор не позволит вам ссылаться на переменную в другом файле так как он его просто не увидит.)
Чтобы предотвратить изменение переменной, определенной с помощью глобальной области видимости, связанной с ней, вы можете добавить модификатор static
к его объявлению. Это ограничивает видимость переменной только этим файлом, как на языке, так и на скомпилированных двоичных уровнях.
Ответ на комментарий
Ваши переменные не переменные экземпляра, вы не получите ошибку, вы должны, если они были. Поэтому моя догадка была неправильной, вместо этого вы неправильно указали свои переменные экземпляра. Вот почему вы всегда должны указывать свой код при задании вопросов. Все, что я могу сделать, это снова угадать. Вот как должны выглядеть выражения переменных переменных экземпляра:
@implementation SomeClass
{ // open brace indicates start of instance declarations
int birdCount; // an instance variable
// ...
} // close brace, end of instance variables
// methods...
@end
Вы пропустили брекеты? Если у вас есть, то вы объявили глобальные, а не переменные экземпляра.
Если эта догадка по-прежнему не так, измените свой вопрос и добавьте свой код! Вам повезло, что сообщество SO не закрыло ваш вопрос, вам нужно помочь людям помочь вам.
HTH
Не могли бы вы добавить фрагменты кода, чтобы показать проблему? – Losiowaty
вы добавили в свои проекты два объекта с одинаковым именем. Просто скопируйте ошибку папок, чтобы получить фактическое имя объекта, или вы можете искать urself в журнале ошибок. –
Это основное заблуждение о том, как работает C/Obj-C. Ограничение заголовка ограничивает видимость, а не конфиденциальность.Также существует большая разница между компиляцией и привязкой. – Sulthan