从类方法调用实例方法:可能还是不?

时间:2011-02-19 06:18:35

标签: objective-c static-methods class-method

在上一篇文章中,我解释说我正在将旧的“C”程序转换为Objective-C,并学习了消息传递(旧版本)静态方法和类方法之间的区别。

但是,我现在如何获得一个类方法来调用实例方法(假设它甚至可能)?这是原始(静态)功能:

static int newSplitB(int b, int hi, int lo, int found)
{
 int hlp;

 if(hi - lo <= 1)
   return 0;

  bIs(lo + (hi - lo + 1) / 2); // calls function bIs();
  return 1;
}

和完全相同的代码“翻译”成Obj-C:

+(int)newSplitB :(int)b :(int)hi :(int)lo :(int)found
{
int hlp;

if((hi - lo) <= 1)
    return 0;

[TablesClass bIs:(lo+(hi-lo+1)/2)]; // gives compile error
return 1;
}

'bIs()'函数 - 为简洁而剪切 - 位于我的'Tables'类中的单独源文件中。不幸的是,尝试构建程序给了我一个'TablesClass'未声明(在此函数中首次使用)错误,即使该类已在同一实现文件中先前已分配/插入。

我在网上搜索了几个小时的解决方案,但无济于事。如果我想要做的是不可能的,我怎么能修改最后一个方法来做我想要的事情?在此先感谢: - )

3 个答案:

答案 0 :(得分:1)

确保您正在导入TablesClass.h文件,否则当前类将不知道其存在,并且是处理此错误时的常见问题。

答案 1 :(得分:1)

你之前在同一个实现文件中说过“分配/插入”TableClass,但似乎你像静态方法一样使用它。当您想要使用其静态方法时,您不必分配/初始化类的实例。另外,如果你在TableClass的实例中分配/ init,那么这意味着你将它存储在newSplitB可以访问的静态方法的某个地方。

答案 2 :(得分:1)

这是可能的,但这是不可能的,取决于你如何看待它:

要调用实例方法,您需要一个对象的实例。如果您有对象,可以从类方法发送此消息。

没有该类的实例,您无法在任何地方调用实例方法。

你可以从任何地方调用类方法(假设它在翻译中可见)。

如果bIS只是一个c函数,则没有需要它是一个实例方法。事实上,你可以把它留作c函数。

(也许一个扩展的例子可以帮助我们理解为什么这必须是一个实例方法)