在Obj-C中使用C语法调用静态方法?

时间:2012-01-05 22:18:44

标签: objective-c syntax

我可以使用适当的Obj-C语法重做这个方法,但我想知道如何从Obj-C调用它。该方法看起来像这样

@interface YarMidiCommon : NSObject

static
MIDIPacketList *makePacketList(Byte *packetBuffer, const UInt8 *data, UInt32 size);

@end

但我不知道如何调用该方法。我试过了

Byte packetBuffer[size+100];
MIDIPacketList *packetList = makePacketList(packetBuffer, bytes, size);

但错误是“具有内部链接但未定义”。如果不采用“适当的”Obj-C语法,这可能吗?

对于记录,我想要模拟的方法类似于

+ (MIDIPacketList*) makePacketListWithPacketBuffer:(Byte*)packetBuffer data:(const UInt8 *)data size:(UInt32)size;

这是冗长而烦人的,因为这里的所有东西都是C.无论如何。

This is related to this other answer I got today.

3 个答案:

答案 0 :(得分:8)

由于该函数是C函数,您需要删除静态关键字,否则它将无法在其翻译单元外看到。一旦你这样做,你的第一个例子将起作用。此外,因为它是一个C函数,将其声明放在@interface的内部或外部,而@implementation内部或外部的定义对你将如何调用它没有任何影响。

答案 1 :(得分:5)

将声明视为等同于全局范围中的静态C函数。这与C ++或Java非常不同。此功能没有类范围或外部链接。

因此,@ interface范围不是声明makePacketList的好地方。该消息表示使用它时定义不可见。

答案 2 :(得分:1)

您需要将该功能移至.m(如果您仅使用此文件,则有意义)或删除static关键字。