尝试理解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);
答案 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特别强调它。