从类方法调用实例方法

时间:2010-01-23 02:54:56

标签: objective-c cocoa cocoa-touch oop

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

示例:

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

-(void)foo {
//cool stuff
}

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

3 个答案:

答案 0 :(得分:26)

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

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

一个例子可能是你有一个'狗'类。您可以使用实例方法来定义狗如何摇尾巴或如何吃东西。您可能有一种购买狗的类方法。

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

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

编辑:澄清一下,最后一段是过于简单化了。 bbum描述的类方法中有一个'self'变量 - 它是计算机对类描述的引用。也就是说,我认为我没有机会在课堂方法中使用“自我”。

答案 1 :(得分:16)

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

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

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

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

-(void)foo {
//cool stuff
}

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

答案 2 :(得分:0)

+ (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];