self关键字对C结构有什么特殊含义吗?

时间:2013-10-04 03:56:27

标签: objective-c c

尝试理解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管理类引用。请注意,这发生在Tap管理类实现的@end之后定义的函数中。

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

3 个答案:

答案 0 :(得分:3)

self在Objective-C方法的上下文中具有 only 的特殊含义。在所有其他情况下,它只是一个普通的标识符。您可以将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成员,全局函数还是类型名称等。虽然后者的使用应该高度劝阻,因为混淆的可能性很大。

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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