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 管理类参考。请注意,这发生在@endTap 管理类实现之后定义的函数中。

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

3 回答 3

3

self在 Objective-C 方法的上下文中具有特殊含义。在所有其他情况下,它只是一个普通的标识符。您可以将 Objective-C 方法视为被重写以获取具有名称的隐藏参数(以及与本讨论无关self的第二个隐藏参数),例如:_cmd

@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成员、全局函数还是类型名称等,但由于潜力巨大,不建议使用后者为混乱。

所以是的,XCodeself在定义中以粉红色突出显示实例struct只是一个解析异常。

于 2013-10-04T04:04:37.523 回答
0

self不是 C 中的关键字。它是 Objective-C 的关键字,这可能是它被突出显示的原因。

于 2013-10-04T04:04:18.680 回答
0

self并不意味着任何特殊的 C 结构字段名称。Objective-C 使用它作为大多数其他 OO 语言的等价物this,这就是 Xcode 特别突出它的原因。

于 2013-10-04T04:04:36.193 回答