所以我需要从Objective-C中的类方法中调用一些实例方法......
示例:
+(id)barWithFoo:(NSFoo *) {
[self foo]; //Raises compiler warning.
}
-(void)foo {
//cool stuff
}
所以我的问题; StackOverFlow是你如何在Objective-C中做这些事情的,我是OOP的新手,所以我是疯了,还是有办法做到这一点?
答案 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];