Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c self关键字对C结构有什么特殊意义吗?_Objective C_C - Fatal编程技术网

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

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管理类将对自身的引用传

试图理解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;
}
在后面的函数(另一个点击回调)中会再次出现混淆。同样,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
    ...
}