Objective-C类与静态指针:如何避免未定义的符号错误?

时间:2010-11-11 13:59:25

标签: objective-c static linker linker-errors categories

我有一个来自外部库的类,我想用类别扩展。但是,此类使用多个静态变量,例如:

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:因为我正在链接包含我想要扩展的类的静态库,所以我最初面临的问题是需要使用Other Linker Flags -ObjC和-all_load来解决。但是我已经过去了,这不是问题,我可以在静态库中为其他类编写类别。

1 个答案:

答案 0 :(得分:3)

C中的static变量(因此,在Objective-C中)不能在定义它的编译单元之外引用。这是一个内部符号,你不能用“extern”来引用它。

所以,不,你的类别方法没有办法访问那个静态变量。

另请注意,“静态”一词的使用与静态库和动态库无关。