道歉,如果这太模糊了......这是我在这里发表的第一篇文章,我对这个问题感到很满意!
我一直在尝试使用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前版本有很大不同的内容。
如果需要更多背景信息,请告诉我。
提前致谢!!
(顺便说一句,感谢所有这些论坛的贡献者......对于热衷但缺乏经验的程序员来说,他们真的是一个很好的资源!)
答案 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];
}