2012-01-05 8 views
4

私はこのメソッドを適切なObj-C構文を使ってやり直すことができましたが、Obj-Cからこれを呼び出す方法が不思議でした。メソッドは次のようになります。Obj-Cの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構文に頼ることなく可能ですか?レコードの

、私がエミュレートしたい方法は、ここですべてがとにかくCであると見て、冗長と迷惑です

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

ようなものになるだろう。

This is related to this other answer I got today.

答えて

8

この関数はC関数なので、静的キーワードを削除する必要があります。そうしないと、翻訳単位の外側に表示されません。一度それを行うと、あなたが持っている最初の例が動作します。また、それは宣言を@interfaceの内側または外側に置くC関数であり、@implementationの内側または外側の定義は、どのように呼び出すかに違いはありません。

+0

大変ありがとうございます。 –

5

グローバルスコープで静的C関数と等価であると宣言を考えます。これはC++やJavaとは大きく異なります。この関数のクラススコープまたは外部リンケージはありません。

このように、@interfaceスコープはmakePacketListを宣言するのには適していません。メッセージは、定義を使用するときに表示されないことを意味します。

+0

「それはしないのですか? –

+1

@ Yarつまり、staticキーワードを削除します。メソッド宣言を '@interface'の中に置くことの重要性についても私の答えを見てください。ヒント:それはなしです。 – Joe

+1

@はい現在のところ、 '@ interface'に関数(静的または外部)を宣言する理由はありません。それは単なるCの関数宣言です。 – justin

1

.m(このファイルからのみ使用する場合は意味があります)に移動するか、staticキーワードを削除する必要があります。

+0

staticキーワードを削除すると、YarMidiCommonをインスタンス化する必要がありますか? –

+1

いいえ、それはobj-cクラスの一部ではないプレーンなC関数です。 – Krizz

関連する問題