从C ++函数(iOS)访问Obj-C属性

罗山·克里希南(Roshan Krishnan)

我正在编写一个iOS应用程序,该应用程序使用Core Audio API在AppDelegate中进行了一些音频处理。@property我的AppDelegate中有一个在ViewController中更新的,并且@property需要在使用C ++编写的渲染回调函数中进行访问。我很生气地发现,不能像在Obj-C方法中那样@property简单地使用_propertyName,就无法在C ++函数中访问Obj-C,所以现在我想知道如何去做。

这是@propertyAppDelegate.h中的my

@property float centerFreq

这是AppDelegate.m中的渲染回调函数:

static OSStatus audioProcessingRenderCallback (
                                               void *                           inRefCon,
                                               AudioUnitRenderActionFlags * ioActionFlags,
                                               const AudioTimeStamp *           inTimeStamp,
                                               UInt32                           inBusNumber,
                                               UInt32                           inNumberFrames,
                                               AudioBufferList *                ioData
                                               ) {
    //audio processing stuff that needs to access _centerFreq
}

我的第一个想法只是制作audioProcessingRenderCallback一个Objective-C方法,但是当我尝试使用以下代码将其设置为回调函数时,这会导致错误:

AURenderCallbackStruct callbackStruct;
callbackStruct.inputProc = audioProcessingRenderCallback;

什么是解决此问题的最佳解决方案?

经过

正如我在对您的帖子的评论中所述,一种方法是更改​​C ++文件的扩展名。扩展名为.mm(即AudioProcessor.mm)。这将启用Objective-C ++,然后您就可以传递对象并从C ++文件对其进行调用。这可能是最简单的。

如果您不能更改C ++文件的扩展名,则需要创建一个桥接函数。

在ViewController(.m文件)中,使C函数如下所示:

void updateCenterFreq( float value ) {
    myViewControllerInstance.centerFreq = value;
}

显然,您必须找到一种使ViewController实例对C函数可见的方法。一种方法是在.m文件中分配静态指针。仅在只有一个实例且不担心线程的情况下才有用,但这可能对您有用。如果您有多个视图控制器实例,则必须找到一种定位实例的方法。如何做到这一点超出了我在这里的回答范围。我将对此进行修正,但如果您打算在非主线程上调用updateCenterFreq(),那么您需要先使用performSelectorOnMainThread来进入主线程,然后再设置centerFreq(我假设是因为它在视图控制器中,正在计划更新UI,必须在主线程上完成)。

现在,在您的AudioProcessor.h文件(C ++文件的标头)中执行以下操作:

extern "C" {
    void updateCenterFreq( float value );
}

然后,您可以在需要时调用updateCenterFreq()。

同样,这不考虑线程安全或实例的定位方式,但这是您可以执行的方式。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何访问C属性?

来自分类Dev

C#属性访问

来自分类Dev

强制obj-c在访问nil属性时引发异常

来自分类Dev

重用访问函数的不同属性的C ++函数中的代码

来自分类Dev

将Obj C项目转换为Swift时访问类的函数时出错

来自分类Dev

在C#中的函数中访问泛型类型的属性

来自分类Dev

OBJ。C.(XCODE 5-IOS 7)自动将变量保存在属性列表中

来自分类Dev

我无法使用C ++访问类的属性

来自分类Dev

在C ++中访问对象指针的属性

来自分类Dev

从目标c中的类外部访问属性

来自分类Dev

C#类库,访问对象属性

来自分类Dev

使用反射 C# 访问属性

来自分类Dev

从 MainViewModel 访问属性(WPF、C#)

来自分类Dev

C ++类/结构中的函数相关属性

来自分类Dev

使用set函数的C ++更新对象属性

来自分类Dev

iOS Objective C 覆盖属性设置器

来自分类Dev

底部共享菜单iOS [Obj-c]

来自分类Dev

C ++函数:内存访问数

来自分类Dev

在Swift中符合Obj-C协议的属性

来自分类Dev

在Swift中符合Obj-C协议的属性

来自分类Dev

obj-c类中的未知swift属性

来自分类Dev

访问在C ++中的函数内部的struct中定义的枚举类属性

来自分类Dev

目标C-IOS-在对象类型上找不到属性-访问对象变量时

来自分类Dev

正确编码直接访问属性C#的后备字段

来自分类Dev

C ++无法从父级访问子级属性

来自分类Dev

如何从C ++中的基类访问派生类的属性?

来自分类Dev

在JavaScript中访问C#公共属性

来自分类Dev

全局访问C#Excel插件中的变量和属性

来自分类Dev

无法在C#中访问Amazon SQS消息属性