从类方法调用实例方法:可能或不可以?
在之前的文章中,我解释说我正在将旧的'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;
}
的 '双()' 功能 - 剪断,为了简洁 - 是坐在我的'表'类的一个单独的源文件中。不幸的是,尽管该类已经在相同的实现文件中被分配/更新过,但试图构建该程序给了我一个未声明(首次在此函数中使用)的'TablesClass'错误。
我已经搜索了一个解决方案的网络小时,但无济于事。如果我想要做的事情是不可能的,我怎么能修改最后的方法来做我以后的事情?在此先感谢:-)
你说你在同一个实现文件中的“alloc/inited”TableClass早些时候,但它好像你正在使用它像一个静态方法。当你想使用它的静态方法时,你不必分配/初始化一个类的实例。另外,如果你在TableClass的实例中分配/ init,那就意味着你将它存储在静态方法newSplitB可以访问的地方。
嗨kailoon。我应该澄清,当我说我已经分配/编入了一切。原始代码被分成七个不同的类(或代码组),'Tables'组包含实例和类方法的** mix **。以为我最好提一下,我把它们全部引入,以防万一有人认为我可能会忽略这样做(可行......而在这种情况下,我当然不会有权访问实例方法)。感谢你帮助我:-) – Bender 2011-02-20 03:43:12
这是可能的,而且是不可能的,这取决于你如何看待它:
调用一个实例方法,你需要一个对象的实例。如果有对象,可以从类方法发送此消息。
如果没有该类的实例,则无法在任何地方调用实例方法。
您可以从任何地方调用类方法(假设它在翻译中可见)。
如果bIS
只是一个c函数,那么没有需要它是一个实例方法。事实上,你可以把它作为一个c函数。
(也许一种扩展,将有助于我们理解为什么这必须是一个实例方法)
是'bIs` C函数或`TablesClass`方法? – BoltClock 2011-02-19 06:21:16