从类方法调用实例方法

Moo*_*oot 17 oop cocoa cocoa-touch objective-c

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

示例:

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

-(void)foo {
//cool stuff
}
Run Code Online (Sandbox Code Playgroud)

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

Mat*_* B. 26

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

类是各种各样的东西.而已.他们只是描述了那种事情的作用.

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

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

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

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


bbu*_*bum 16

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

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

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

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

-(void)foo {
//cool stuff
}
Run Code Online (Sandbox Code Playgroud)

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

  • 不,它没有.一种常见的模式是实例化某个对象,然后将其告诉`-startDoingSomethingUsefulAutomatically`.一旦启动,对象可以留给自己的设备用于应用程序会话的其余部分. (3认同)
  • 它也不是一种解决方法.您询问了如何从类方法调用实例方法.要这样做需要一个实例.故事结局. (2认同)