在Objective-C的单个文件中的类之间共享“静态”方法

|| 我对“ 0”方法感到困惑,该方法的定义显然存在于一个类中,但是其声明在同一文件的多个类之间共享。可以以某种方式在文件之间共享吗? 细节 我正在尝试将ѭ1文件分成几个文件(每个类一个)。所有源代码均来自Pete Goodliffe的CoreMIDI Example。 我从这里开始学习PGMidi类,并将其分解为单独的接口和类。除了标记为“ 0”的一种方法外,其他所有内容都可以完美编译,该方法必须同时放在两个位置(在PGMidi中为“已使用但从未定义”)。该方法在任何类实现之外的这一行中都是“已使用”:
static void PGMIDIReadProc(const MIDIPacketList *pktlist, void *readProcRefCon, void *srcConnRefCon);
这显然是由同一文件中所有类共享的(是什么?)。在两堂课中都有提到。 1)在
PGMidi
中使用它(也许指向
PGMidiSource
s = MIDIInputPortCreate(client, (CFStringRef)@\"MidiMonitor Input Port\", PGMIDIReadProc, self, &inputPort);
2)在
PGMidiSource
中,定义了方法主体
static
void PGMIDIReadProc(const MIDIPacketList *pktlist, void *readProcRefCon, void *srcConnRefCon)      
{
   PGMidiSource *self = (PGMidiSource*)srcConnRefCon;
   [self midiRead:pktlist];
}
问题是方法主体中提到的
self
PGMidi
中没有意义(没有
midiRead
方法)。
static
方法是什么?如何使它在两个文件之间工作?     
已邀请:
        在功能上,关键字
static
大致表示\“仅在此文件内可见和可用”。由于它是在
PGMidiSource.mm
中定义的,因此您不能从
PGMidi.mm
中调用它。幸运的是,这很容易解决。 在
PGMidiSource.h
中声明函数原型,如下所示:
void PGMIDIReadProc(const MIDIPacketList *pktlist, void *readProcRefCon, void *srcConnRefCon);
删除
PGMidiSource.mm
中的
static
关键字,因为它需要从该文件外部可用。 请注意,这不是“方法”;它是一个C函数。因此,它不属于任何类,不与任何实例绑定,无法访问任何实例变量等。必须将其需要的任何上下文作为参数传递。因此,尽管此函数使用一个名为“ self”的变量,但实际上它只是传入的参数之一的本地别名。     
        静态函数只是普通的C函数。 \'static \'表示只能从同一文件内对其进行访问。因此,您需要: 为您要使用的每个文件重新定义它,通常是将整个静态函数定义放在标头中,并将标头包含在要使用它的每个文件中,或者 使它成为非静态函数,然后将函数原型放在标头中,然后将标头包含在要使用它的每个文件中。     
        看起来“方法”在多个类之间共享的原因是因为从技术上讲它不是方法。而是C函数。您可以通过这种方式将C添加到目标C,并且可以从多个文件中调用该特定函数,尽管在头文件中为没有文件的文件提供“原型”是一种很好的做法在其中实现的实际功能。 (或者这是我最后一次用C编写。已经有一段时间了。) 如果您没有在其他文件中提供原型,C会让您一路狂奔(尽管编译器可能会在警告中说它对该功能一无所知。)但是链接程序将解决并假设其编码正确,它应该可以正常工作。     

要回复问题请先登录注册