Objective C linker scoping - PullRequest
       2

Objective C linker scoping

0 голосов
/ 12 января 2012

Я столкнулся с ситуацией, когда у меня были следующие две реализации, расположенные в отдельных файлах:

ClassA.m

@implementation ClassA 
int _x = 0;
@end

ClassB.m

@implementation ClassB
int _x = 0;
@end

Когда я скомпилировал, компоновщик сказал бы:

цель c повторяющимся символом __x ....

Моим решением было пометить обе переменные как static.

Правда ли, что все переменные-члены классов просто добавляются в таблицу символов без добавления префикса их имени реализации (если вы не пометите их как статические)? В это трудно поверить, иначе я бы подумал, что использование static будет правилом, а не исключением ...

Ответы [ 2 ]

4 голосов
/ 12 января 2012

Вы не объявили переменные экземпляра класса там;поэтому вы объявили глобальные переменные, поэтому компоновщик сообщает вам, что есть 2 символа с именем _x.

. Возможно, вы хотели поместить их в свои @interface для ClassA и ClassB.

1 голос
/ 12 января 2012

Переменная экземпляра будет объявлена ​​в файле реализации вашего класса, в файле заголовка.Вам нужно, чтобы файлы двух классов имели что-то вроде этого:

@interface ClassA : NSObject
{
    int _x;  // or NSInteger _x;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...