2

WWDC 2012 の MTAudioProcessingTap サンプル コードを理解しようとしています。

この構造体は、Tap がデータを渡すために使用されます。

typedef struct AVAudioTapProcessorContext {
    ...
    void *self; //Note use of word self
} AVAudioTapProcessorContext;

ここにある単語selfは、Xcode でピンク色で強調表示されていますが、明らかに標準の変数名として使用されています。これは Xcode でのコード解析の単なる見落としですか?

その後、Tap 管理クラスは自身への参照をこの変数に渡します。

//Setting up Tap callbacks:
callbacks.clientInfo = (__bridge void *)self,

//And then storing it in the above struct when it's passed by the callback:
static void tap_InitCallback(MTAudioProcessingTapRef tap, void *clientInfo, void **tapStorageOut)
{
    AVAudioTapProcessorContext *context = calloc(1, sizeof(AVAudioTapProcessorContext));

    ...
    context->self = clientInfo;

    *tapStorageOut = context;
}

そして、混乱は後の関数 (別の Tap コールバック) で再び始まります。ここでも、単語 self は Tap 管理クラス リファレンスを参照するために使用されます。@endこれは、Tap 管理クラスの実装の後に定義された関数で発生することに注意してください。

AudioFFTTapProcessor *self = ((__bridge AudioFFTTapProcessor *)context->self);
4

3 に答える 3

3

selfObjective-C メソッドのコンテキストでのみ特別な意味を持ちます。他のすべてのコンテキストでは、これは単なる通常の識別子です。selfObjective-C のメソッドは、名前の付いた隠しパラメーター(および、_cmdこの説明には関係ない名前の 2 番目の隠しパラメーター)を受け取るように書き直されていると考えることができます。たとえば、次のようになります。

@implementation MyClass

- (void)doSomething:(int)param1 withThis:(NSString *)param2
{
    // 'self' refers to the MyClass instance in this function
    ...
}
@end

次のように書き直されたかのように想像できます。

void MyClass_doSomething(id self, SEL _cmd, int param1, NSString *param2)
{
    // 'self' refers to the MyClass instance in this function
    ...
}

Objective-C メソッド以外では、ローカル変数、メンバー、グローバル関数、または型名など、self他の種類の識別子として使用できますが、後者の使用は可能性が高いため非常に推奨されません。struct混乱のために。

そうselfです、定義内でインスタンスをピンク色で強調表示する XCodestructは、単なる解析異常です。

于 2013-10-04T04:04:37.523 に答える
0

selfは C のキーワードではありません。Objective-C のキーワードであるため、強調表示されている可能性があります。

于 2013-10-04T04:04:18.680 に答える
0

selfC 構造体フィールド名として特別な意味はありません。Objective-C はこれを他のほとんどの OO 言語の と同等のものとして使用しますthis。そのため、Xcode はそれを特別に強調しています。

于 2013-10-04T04:04:36.193 に答える