【问题标题】:Call instance method from class method从类方法调用实例方法
【发布时间】:2010-01-23 02:54:56
【问题描述】:

所以我需要从Objective-C中的类方法中调用一些实例方法...

例子:

+(id)barWithFoo:(NSFoo *) {
[self foo]; //Raises compiler warning. 
}

-(void)foo {
//cool stuff
}

所以我的问题; StackOverFlow 是你如何在 Objective-C 中做这些事情的,我对 OOP 有点陌生,所以我疯了,还是有办法做到这一点?

【问题讨论】:

  • 这个帖子为我回答了这个问题:stackoverflow.com/questions/1053592/…
  • 不,它没有回答 Moot 的问题。 Moot 想知道是否可以从类方法内部调用实例方法。不,我们不能!!但是您可以使用NSNotificationCenter,在您的实例方法上添加一个带有选择器的观察者,并在您的类方法中添加postNotification

标签: objective-c cocoa cocoa-touch oop


【解决方案1】:
+ (MyClass *)getInstance
{
    static MyClass *classInstance;

    @synchronized(self)
    {
        if (!classInstance)
        {
            // This is never freed.  Is a singleton a leak?
            classInstance = [[[MyClass alloc] init] retain];
        }
    }

    return classInstance;
}

[[MyClass getInstance] instanceMethod];

【讨论】:

    【解决方案2】:

    如果你想调用一个实例方法,你需要一个实例来调用该方法。

    self 是对正在发送消息的实例的引用。因此类方法中的self 是类,实例方法中的self 是类的一个实例。

    所以,天真地,你可能会这样做:

    +(id)barWithFoo:(NSFoo *) {
        [[[self alloc] init] foo]; //Raises compiler warning. 
    }
    
    -(void)foo {
    //cool stuff
    }
    

    当然,这会在非 GC 应用程序中泄漏内存(因为实例没有被释放或自动释放)。我不会解释原因,而是将您指向Objective-C intro documentation。这是一些很棒的东西,涵盖了 Objective-C 和一般的面向对象编程模式。

    【讨论】:

    • 这是一个很好的解决方法谢谢!虽然我不得不承认,这确实违背了面向对象。
    • 不,它没有。一个常见的模式是实例化一些对象,然后告诉它-startDoingSomethingUsefulAutomatically。一旦启动,该对象可能会在应用会话的其余部分留给自己的设备。
    • 这也不是一种解决方法。您询问了如何从类方法调用实例方法。这样做需要一个实例。故事结束。
    【解决方案3】:

    没有办法做到这一点。它根本不适用于面向对象。

    类是事物的种类。而已。他们只是描述那种事情的作用。

    一个例子可能是你有一个“狗”类。您将拥有定义狗如何摇尾巴或如何进食的实例方法。你可能有一个购买狗的类方法。

    我的宠物狗 Fido 是类狗的一个实例。我可以给 Fido 发信息,告诉他摇尾巴吃他的食物。但是,我不能要求“狗”班摇尾巴;谁的尾巴会摇?是 Fido 的,还是我邻居的狗?

    当您向班级发送消息时,您没有可使用的“self”变量。没有什么可以告诉自己摇尾巴。类消息主要用于创建类的实例或获取其他一般信息。

    编辑:为了澄清,最后一段过于简单化了。正如 bbum 所描述的那样,类方法中有一个“自我”变量——它是计算机对类描述的引用。也就是说,我认为我从来没有机会在类方法中使用“self”。

    【讨论】:

    • 这是相当有启发性的!非常感谢!
    猜你喜欢
    • 2016-08-30
    • 1970-01-01
    • 2011-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-20
    • 1970-01-01
    相关资源
    最近更新 更多