【问题标题】:Calling instance method from class method: Possible or no?从类方法调用实例方法:可能与否?
【发布时间】:2011-02-19 06:18:35
【问题描述】:

在上一篇文章中,我解释说我正在将旧的“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()”函数——为简洁起见——位于我的“表”类中的一个单独的源文件中。不幸的是,尝试构建程序会给我一个“TablesClass”未声明(在此函数中首次使用)错误,即使该类之前已在同一实现文件中分配/初始化。

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

【问题讨论】:

  • bIs 是 C 函数还是 TablesClass 方法?

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


【解决方案1】:

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

【讨论】:

  • 嗨,raidfive。是的。我已经重新检查了一千次,以确保这不是问题。事实上,我过度杀戮并为七个不同的类中的每一个提供了所有标题(无论他们是否需要它们)只是为了确保。不幸的是,没有任何区别。感谢您愿意在这里帮助我:-)
  • 没问题,值得一试 :) 通常我检查的第一件事。有兴趣看看实际问题是什么。
【解决方案2】:

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

【讨论】:

  • 嗨凯隆。当我说我会分配/初始化一切时,我应该澄清一下。原始代码分为七个不同的类(或代码组),“表”组包含实例和类方法的混合。我想我最好提一下我已经启动了它们,以防有人认为我可能忽略了这样做(可行......在这种情况下,我当然也无法访问实例方法)。感谢您在这里帮助我:-)
【解决方案3】:

有可能,也有不可能,取决于你如何看待它:

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

没有类的实例,你不能在任何地方调用实例方法。

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

如果bIS 只是一个c 函数,那么不需要它是一个实例方法。实际上,您可以将其保留为 c 函数。

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

【讨论】:

  • 嗨贾斯汀。关于'C'函数的好点。没有理由将这段 18yo 代码的每一行 必须 转换为 Obj-C,除非是自然倾向于这样做——这开辟了许多其他可能性,例如使用 NSMutableArray 更简单的数组处理方法等。 . 但问题仍然是如何声明任何(未更改的)静态“C”方法,如我的第一个 sn-p 并让它编译。代码有 1,300 行,所以我专注于已知问题,而不是尝试扩展示例并且不知道在哪里停止。在此感谢您的帮助 :-) 再给我一周时间...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-30
  • 2012-06-03
  • 1970-01-01
  • 1970-01-01
  • 2011-02-01
相关资源
最近更新 更多