结合objective-c和c ++的正确方法?

时间:2012-07-20 05:55:32

标签: iphone c++ objective-c ios ios5

我正在开发一款可以对输入音频进行实时处理的应用。我找到了this网站,我认为我可以将其作为起点。但是,提供的所有功能都是用C ++编写的。

我首先要做的最简单的事情是将UILabel的文本更改为函数接收的一些值:

OSStatus renderCallback(void *userData, AudioUnitRenderActionFlags *actionFlags,
                    const AudioTimeStamp *audioTimeStamp, UInt32 busNumber,
                    UInt32 numFrames, AudioBufferList *buffers)

我将所有函数粘贴到我视图的@implementation中,并且可以通过将扩展名更改为.mm来编译。我创建了一个UILabel属性,但renderCallback函数无法访问它。

显然,将这​​些函数粘贴到@implementation中并不是正确的方法。我该怎么做正确的方法?

2 个答案:

答案 0 :(得分:0)

尽管C ++基本上可以按原样进入.mm文件,但这并不总是有效(例如,如果你有一个名为id的变量,它将与Objective-C冲突)。您可以将大多数C ++代码保留在单独的文件中,并将#import相应的C ++ .h文件放入创建.mm等的UILabel中。

至于UILabel要求的内容;您需要创建NSString*值。一种可能性就像stringWithFormat:,例如

int myInt = 0;
const char *myString = "string";
id myObject = @"object";
NSString* myString = [NSString stringWithFormat:@"here is a number: %d, here is a C string: %s, here is an object: %@", myInt, myString, myObject];

你可以想象从你的C ++代码中获取你想要的任何原始值,并使用如上所述的格式化字符串将它们转换为单个标签值。

答案 1 :(得分:0)

您无法直接在C / C ++方法中访问objective-c变量。将您的对象传递到void *userData

-(void)Method
{
renderCallback(self, &actionFlags,
                    &audioTimeStamp, busNumber,
                    numFrames, &buffers);
}

OSStatus renderCallback(void *userData, AudioUnitRenderActionFlags *actionFlags,
                    const AudioTimeStamp *audioTimeStamp, UInt32 busNumber,
                    UInt32 numFrames, AudioBufferList *buffers)
{
id obj;
    if (userData)
   {
    obj = (id)userData;
    [obj MethodB];
   }
//....  

}