2016-01-29 5 views
0

Я хочу использовать структуру c-style в нескольких классах, но я борюсь с ее глобальным доступом.Как использовать структуру c-style в нескольких классах

Я определяю структуры в заголовочном файле класса «Утилиты»:

typedef struct 
{ 
    int  length; 
    SInt16  *someData; 
} NewStruct; 


+ (NewStruct *)initStructWithValue:(int)length; 

В другом классе я инициализировать эту структуру с помощью метода класса из Utitlities:

@property (nonatomic, assign) NewStruct *newStruct; 

_newStruct = [Utilities initStructWithValue: 5] 

Теперь я хочу используйте newStruct в других классах. Однако, когда я ставлю

extern NewStruct *newStruct; 

в верхней части заголовка-файлов он не работает, кажется, что у меня нет доступа к newStruct.

Я получаю ошибку: команда линкер потерпела неудачу с кодом выхода 1 (использование -v, чтобы увидеть вызова)

Что я делаю не так, и что было бы лучшим способом сделать это? Или, может быть, лучше избегать использования этой структуры в качестве глобальной переменной?

+0

Почему вы используете c-структуру вместо объективного класса c? – ganchito55

+0

Я использую его в сочетании с основным звуком с очень низкой задержкой – Gerard

+0

@ ganchito55 даже яблоко использует их, см. 'CGRect',' CGPoint'. Они полезны для некоторых случаев. – meth

ответ

0

Ключевое слово extern означает «объявить без определения». Другими словами, это способ явно объявить переменную или принудительно объявить без определения. Но когда компоновщик собирает ваш объектный код, ему нужна переменная, которую нужно определить где-то, а это значит, что у вас должен быть источник, где переменная есть без ключевого слова extern NewStruct *newStruct;.

С помощью метода выше вы рассматриваете эту переменную как глобальный синглтон. Если вам нужно несколько экземпляров, вы должны просто использовать @property, как указано выше.

+0

Это то, что я сейчас реализовал. Однако с этим кодом я, похоже, не получаю доступ к myNewStruct в других классах (в настоящее время он инициализируется как локальная переменная _myNewStruct). По-видимому, неправильно писать «extern NewStruct * myNewStruct;» в заголовочном файле других классов? Знаете ли вы, что я делаю неправильно? – Gerard

+0

Извините, я неправильно понял вашу проблему. Я обновляю ответ. –

+0

Это проясняет многое. Оно работает! – Gerard

Смежные вопросы