Ios 如何称呼Objective-C“;“自我”;从C方法

Ios 如何称呼Objective-C“;“自我”;从C方法,ios,objective-c,c,Ios,Objective C,C,在我的iOS项目中,我有Objective-C类,在同一类中实现Objective-C和C代码。我将扩展名改为.mm,这部分运行良好。现在我想设置一个C方法,在同一个类中调用Objective-C方法。我遇到的问题是,当我试图从C方法调用self时。 代码如下: void SetNotificationListeners(){ [self fireSpeechRecognition]; } 错误是: Use of undeclared identifier 'self' 如何处理此问

在我的
iOS
项目中,我有
Objective-C
类,在同一类中实现
Objective-C
C
代码。我将扩展名改为
.mm
,这部分运行良好。现在我想设置一个
C
方法,在同一个类中调用
Objective-C
方法。我遇到的问题是,当我试图从
C
方法调用
self
时。 代码如下:

void SetNotificationListeners(){
    [self fireSpeechRecognition];
}
错误是:

Use of undeclared identifier 'self'

如何处理此问题?

将self作为函数调用的参数:

void SetNotificationListeners(void *myObj){
[(MyClass*)myObj fireSpeechRecognition];
}

//in objC
SetNotificationListeners(self);
或者有一个保存引用的全局变量

//global variable
static MyClass *myObj;

//in obj c
myObj = self;
SetNotificationListeners(); //use myObj instead of self in function

在我看来,第一个更好。

在Objective-C方法中,有两个参数隐式地传递到每个方法中,它们是
self
\u cmd
。这就是为什么您可以从方法中访问
self

当从Objective-c方法调用时,您可以将
self
作为参数传递给您的c函数,但是对于这个简单的示例,我不确定您为什么不使用方法


您不需要将文件扩展名更改为
.mm
,除非您使用的是Objective-C++

您必须将实例指针传递给C函数:

void SetNotificationListeners(void *uData)
{
    MyClass *obj = (__bridge MyClass *)(uData);
    [obj fireSpeechRecognition];
}

- (void)myMethod
{
    // Call C function from Objective-C method:
    myFunction((__bridge void *)(self));
}

(只有使用ARC编译时才需要“brigde”内容。)

您不必更改文件扩展名。Objective-C是C的超集,这意味着您可以在Objective-C文件中随意使用普通C

当您编写Objective-C方法的实现时,该方法总是在某个特定实例的上下文中执行,即
self
部分。在Objective-C方法中自动获得
self
,但在幕后它只是作为参数传递给该方法,请参阅


您的纯C函数不是类的一部分(纯C函数从来都不是),因此在调用它时没有与之关联的实例,也没有隐式的
self
。如果希望函数调用某个实例,则必须显式传递指向该实例的指针。例如,一些普通的C API有一个“上下文”指针,您可以在注册回调时传递该指针。有关这方面的示例,请参见邻近的答案。

这是iOS,而不是iOS。无论如何,为什么您希望从不属于该类的函数中访问
self
?这根本没有道理。您需要将实例(对象)本身作为参数传入。当您使用Objective-C和C(您没有提到C++)时,为什么要将扩展名更改为
.mm
?第二个是疯狂:),正如我所说,我更喜欢第一个选项。有趣的是,当我在这个问题的“现在发现”副本中以10票赞成的标记答案提到同样的“疯狂”时,我是如何被否决的……读了这篇文章,我问,在C中你把目标C称为哪里?这里你说的是“从Objective-C调用C函数”。。。不明白…这让我困惑!rs