Категория Objective-C со статическими указателями: как избежать ошибки неопределенных символов? - PullRequest
0 голосов
/ 11 ноября 2010

У меня есть класс из внешней библиотеки, который я хочу расширить категорией.Однако этот класс использует несколько статических переменных, таких как:

static SomeClass* someClass;

Метод категории, который я расширяю, должен сделать вызов этого класса, как в

-(void) categoryMethod
{
   [someClass someMethod];
}

Если я это сделаючто компилятор будет жаловаться:

'someClass' was not declared in this scope

Итак, я решил, что мне, вероятно, нужно объявить статический SomeClass как extern:

extern SomeClass* someClass;

Однако это приводит к следующей ошибке компоновщика:

"_someClass", referenced from:
_someClass$non_lazy_ptr in UsingSomeClass.o
(maybe you meant: _someClass$non_lazy_ptr)
Symbol(s) not found

Я думаю, что мне не хватает чего-то простого и глупого.Я могу использовать статическую библиотеку просто отлично.Я предполагаю, что статические переменные являются локальными для класса, который я хочу расширить, есть ли способ сказать компоновщику, что это статические переменные, которые я собираюсь использовать?

Или это просто неМожно ли расширить класс Objective-C, который использует статические переменные (соответственно, где моя категория должна использовать эти статические переменные)?

PS: поскольку я связываю статическую библиотеку, которая содержит класс, который я хочу расширить,Первоначально я столкнулся с проблемой, которую необходимо решить с помощью других флагов компоновщика -ObjC и -all_load.Но я прошел через это, это не проблема, я могу писать категории для других классов в этой статической библиотеке просто отлично.

1 Ответ

3 голосов
/ 11 ноября 2010
На переменную

A static в C (и, следовательно, в Objective-C) нельзя ссылаться вне определяющей ее единицы компиляции. Это внутренний символ, на который нельзя ссылаться с помощью «extern».

Итак, нет, ваш метод категории не может получить доступ к этой статической переменной.

Обратите также внимание, что использование слова "static" не имеет ничего общего со статическими и динамическими библиотеками.

...