Objective c self关键字对C结构有什么特殊意义吗?
试图理解WWDC 2012中的MTAudioProcessingTap示例代码 Tap使用此结构传递数据Objective c self关键字对C结构有什么特殊意义吗?,objective-c,c,Objective C,C,试图理解WWDC 2012中的MTAudioProcessingTap示例代码 Tap使用此结构传递数据 typedef struct AVAudioTapProcessorContext { ... void *self; //Note use of word self } AVAudioTapProcessorContext; 这里的单词self显然是作为标准变量名使用的,即使Xcode以粉色突出显示它。这只是Xcode中的代码解析疏忽吗 稍后,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;
}
在后面的函数(另一个点击回调)中会再次出现混淆。同样,self一词用于表示Tap管理类参考。请注意,这发生在Tap管理类实现的@end
之后定义的函数中
AudioFFTTapProcessor *self = ((__bridge AudioFFTTapProcessor *)context->self);
self
不是C中的关键字。它是Objective-C的关键字,这可能就是为什么它会突出显示的原因。self
作为C结构字段名并不意味着任何特殊的含义。Objective-C使用它作为大多数其他OO语言的等价物,这就是Xcode特别强调它的原因。self
仅在Objective-C方法的上下文中具有特殊意义。在所有其他上下文中,它只是一个普通标识符。您可以将Objective-C方法视为重写以获取名为self
的隐藏参数(以及与本讨论无关的名为\u cmd
的第二个隐藏参数),例如:
可以想象它被改写成这样:
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在
struct
定义中以粉红色突出显示self
实例只是一种解析异常。我最好的猜测是,self
这个词作为类实现外部使用的变量名没有特殊意义,因此,他们使用它来引用这些函数密切相关的类,它只是被高亮显示为粉红色,因为Xcode没有检查单词self
的上下文。不是在C中,self
不是关键字,它只是一个特殊的参数名。只是Xcode总是突出显示它,不管是什么上下文
void MyClass_doSomething(id self, SEL _cmd, int param1, NSString *param2)
{
// 'self' refers to the MyClass instance in this function
...
}