Objective-C:如何声明子类可见的静态成员?

gon*_*nso 22 inheritance static objective-c

我正在声明一系列处理通信协议的静态类.我想声明一个处理常见消息的父类,如ACK,内联错误......

我需要一个静态var来保存当前正在处理的元素,我想在父类中声明它.

我是这样做的:

parent.m

@implementation ServerParser

static NSString * currentElement;
Run Code Online (Sandbox Code Playgroud)

但是子类没有查看currentElement.

Ale*_*ski 35

如果您在声明一个类的实现文件的静态变量,则该变量是只看到那个班.

您可以在类的头文件中声明静态变量,但是,它#import对于标头的所有类都是可见的.

一种解决方法是在父类中声明静态变量,如您所述,但也创建一个类方法来访问变量:

@implementation ServerParser

static NSString *currentElement;
...
+ (NSString*)currentElement
{
    return currentElement;
}
...
@end
Run Code Online (Sandbox Code Playgroud)

然后,您可以通过调用以下方法检索静态变量的值:

[ServerParser currentElement];
Run Code Online (Sandbox Code Playgroud)

然而,除非他们使用该方法,否则该变量对其他类不可见.

  • WOAWOAOWAWOA:如果在标题中声明一个静态变量,然后导入标题,则导入标题的每个文件(实际上是编译单元)将引用同名的DIFFERENT变量.所以如果你说(例如)currentElement = [[element alloc] init]; 在超类初始化中,然后尝试在子类中获取currentElement,currentElement仍然是子类的nil! (5认同)

Мор*_*орт 5

解决方法是在父类的实现中声明静态变量,并在父类中声明属性.然后在accessor方法中访问静态变量.这样,您可以使用点语法访问静态变量,例如属性.所有子类都访问相同的共享静态变量.