【问题标题】:Objective-C: how to declare a static member that is visible to subclasses?Objective-C:如何声明对子类可见的静态成员?
【发布时间】:2010-10-25 02:28:14
【问题描述】:

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

我需要一个静态变量来维护当前正在处理的元素,并且我想在父类中声明它。

我是这样做的:

父.m

@implementation ServerParser

static NSString * currentElement;

但是子类没有看到 currentElement。

【问题讨论】:

  • 为什么要使用静态变量和类方法?如果将来你想同时使用你的类怎么办?如果您需要处理超过 1 个连接或需要多个实例怎么办?坦率地说,它看起来像是一个破损的设计。
  • 这是一个荒谬的说法。静态变量有很多用途。

标签: objective-c inheritance static


【解决方案1】:

如果你在一个类的实现文件中声明了一个静态变量,那么这个变量只对那个类可见。

您可以在类的头文件中声明静态变量,但是,#import 头文件的所有类都可以看到它。

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

@implementation ServerParser

static NSString *currentElement;
...
+ (NSString*)currentElement
{
    return currentElement;
}
...
@end

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

[ServerParser currentElement];

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

【讨论】:

  • 感谢您的提示。我没有想到访问方法。无论如何,我结束了将“静态”类更改为“实例”行为。
  • WOAWOAOWAWOA:如果你在头文件中声明一个静态变量,然后导入头文件,每个导入头文件的文件(实际上是编译单元)将引用一个不同的同名变量。因此,如果您说(例如) currentElement = [[element alloc] init];在超类初始化,然后尝试在子类中获取currentElement,currentElement对子类仍然会是nil!
  • @Jared P 我知道这篇文章已经有一段时间了,但是你能解释一下如何避免你所描述的问题吗?
  • @AWrightIV,在标头中声明变量 extern。但最好的方法是只通过类中的包装方法访问静态变量。
  • 类方法是公有的还是私有的?
【解决方案2】:

一种解决方法是在父类的实现中声明静态变量,并在父类中声明一个属性。 然后在访问器方法中访问静态变量。通过这种方式,您可以使用点语法访问静态变量,例如属性。所有子类都访问同一个共享静态变量。

【讨论】:

    【解决方案3】:

    更简单。创建一个带有受保护静态变量的预基类。例如:

    public abstract class preBase {
    
    protected static int VariableStaticPrivate;
    

    }

    公共抽象类 Base : preBase{

    //Inherit VariableStaticPrivate
    //And you can use it.
    

    }

    公共类 DerivedOne : Base {

    //Also inherit VariableStaticPrivate
    //And you can use it.
    

    }

    【讨论】:

    • 大声笑也许有一天你会知道你周围发生了什么,谁知道,有一天!附言我什至没有投反对票 xD
    猜你喜欢
    • 1970-01-01
    • 2021-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-27
    • 2011-02-20
    • 2011-02-24
    • 1970-01-01
    相关资源
    最近更新 更多