super allocWithZone在单例类概念中有一些疑问

sac*_*hin 7 objective-c

我是Objective-C的新手,我正在尝试根据Apple的文档创建一个单例类.

+ (MyGizmoClass*)sharedManager
{
    if (sharedGizmoManager == nil) {
        sharedGizmoManager = [[super allocWithZone:NULL] init];
    }
    return sharedGizmoManager;
}

+ (id)allocWithZone:(NSZone *)zone
{
    return [[self sharedManager] retain];
}
Run Code Online (Sandbox Code Playgroud)

在此代码中sharedManager是一个静态方法,它将检查此类的对象是否存在.如果是这样,它将返回先前创建的对象,否则它将创建一个新对象.

我有一些问题:

  1. 如果sharedManager是静态的,它如何访问super

  2. 当我打印[super class]为什么它给出当前的类名?

  3. 为什么[[super allocWithZone:NULL] init]返回当前的类对象?

  4. 如果super等于self这里,为什么它不调用当前类allocWithZone:(NSZone *)zone

Jam*_*ter 3

其他答案虽然指出了有关单身人士的良好信息,但实际上并没有回答您的问题。您的问题实际上主要基于面向对象,您专门引用单例的事实是偶然的。

  1. 我参考回答了这个问题self,这是答案的解释,重要部分

    super在类级别上下文中确实有意义,但它指的是超类本身,而不是实例

  2. 这个也让我失望了。我问了这个问题,得到的结论是:

    [super class]调用super当前实例的方法(即self)。如果 self 有一个重写的版本,那么它将被调用并且看起来会有所不同。由于您不覆盖它,因此调用[self class]与调用相同[super class]

  3. 您确定它实际上返回了此类的实例吗?或者您是否将其分配给sharedGizmoManager此类的实例?

  4. Super 不等于 self,而是您调用的一些方法:例如,正在[super class]调用将要调用的方法的相同实现[self class]

  • 我认为#2 没有切中要害。super,一个不能被覆盖的*关键字*,向超类发送消息。在静态方法中(不是真正的静态方法,而是 *Class* 类的动态方法),超类是一个 *NSObject*。*NSObject* 的 *class* 方法在使用“super”调用时返回子类,因此静态方法中的“[self class]==[super class]”。 (2认同)

归档时间:

查看次数:

1603 次

最近记录:

12 年,3 月 前