将音频单元代码转换为ARC

时间:2012-02-27 20:46:13

标签: ios xcode4.2 automatic-ref-counting core-audio

道歉,如果这太模糊了......这是我在这里发表的第一篇文章,我对这个问题感到很满意!

我一直在尝试使用Audio Units将iOS Xcode项目转换为ARC,但它似乎打破了音频单元处理类的功能。一些症状......当我尝试在AUProcessor.mm中引用'self'时,AUProcessor类被称为'const *',而在ARC之前的版本中,没有提到'const *'。

这个指向'self'的指针会产生以下错误:

callbackStruct.inputProcRefCon = self;

[error] Assigning to 'void *' from incompatible type 'AUProcessor *const __strong'.

我可以通过在self之前添加(__bridge void *)来删除错误,这允许项目进行编译。但是,音频单元处理器在应用程序中不起作用。

在类的引用方式方面,我在代码中的其他地方看不到与ARC前版本有很大不同的内容。

如果需要更多背景信息,请告诉我。

提前致谢!!

(顺便说一句,感谢所有这些论坛的贡献者......对于热衷但缺乏经验的程序员来说,他们真的是一个很好的资源!)

3 个答案:

答案 0 :(得分:9)

通常情况下,(__bridge void*)将是正确的演员。这意味着“在不应用任何内存管理的情况下获取指向此对象的指针;我保证只要需要它就会保留它。” (最后一部分只是暗示,但如果你不这样做,你就会崩溃。)

你确定self只要这个音频单元继续存在吗?如果没有任何内容强烈引用self,那么它将会消失,inputProcRefCon将成为悬空指针。

当你说“在应用程序中不起作用”时,你的意思是什么?它崩溃了吗?回调不会发生吗?当回调发生时,它没有正确的数据吗?

答案 1 :(得分:1)

我设法通过使用编译器标记-fno-objc-arc从ARC中排除麻烦的类来解决我的问题。

这不是一个非常令人满意的结论,但至少我的应用程序再次运行......看起来我需要了解更多有关内存管理的知识!

答案 2 :(得分:0)

以下代码适用于MusicPlayer API。我不知道它是正确的,但我没有收到任何错误或内存泄漏。希望它有所帮助!

//分配回调:

 MusicSequenceSetUserCallback( sequence, MyEventCallback, (__bridge_retained void *)self );

//回调方法:

void  MyEventCallback(void                      *inClientData,
                  MusicSequence             inSequence,
                  MusicTrack                    inTrack,
                  MusicTimeStamp                inEventTime,
                  const MusicEventUserData  *inEventData,
                  MusicTimeStamp                inStartSliceBeat,
                  MusicTimeStamp                inEndSliceBeat)
{

struct MyMusicEventUserData* userEventData = ( MyMusicEventUserData *)inEventData;

[(__bridge MusicPlayerController*)inClientData MIDIEvent:userEventData 
                                               eventTime:inEventTime 
                                          startSliceBeat:inStartSliceBeat 
                                            endSliceBeat:inEndSliceBeat];
}