Переход кода аудиоустройства в ARC - PullRequest
3 голосов
/ 28 февраля 2012

Приношу извинения, если это слишком расплывчато ... это мой первый пост здесь, и я хорошо и действительно озадачен этим вопросом!

Я пытался перевести проект iOS Xcode с помощью Audio Unitsв ARC, но, похоже, нарушена функциональность класса обработки аудиоустройства.Некоторые симптомы ... Когда я пытаюсь сослаться на «self» в AUProcessor.mm, класс AUProcessor упоминается как «const *», тогда как в версии, предшествующей ARC, не упоминалось «const *».

Указатель на «self» выдает следующую ошибку:

callbackStruct.inputProcRefCon = self;

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

Я могу устранить ошибку, добавив (__bridge void *) впередсебя, что позволяет компилировать проект.Тем не менее, процессор Audio Unit не работает в приложении.

Я не вижу ничего в другом месте кода, который значительно отличается от версии до ARC с точки зрения того, как на класс ссылаются.

Дайте мне знать, если потребуется больше контекста.

Заранее спасибо !!

(Кстати, спасибо всем участникам этих форумов ... они действительно замечательныересурс для увлеченных, но неопытных программистов!)

Ответы [ 3 ]

9 голосов
/ 28 февраля 2012

Как правило, (__bridge void*) будет правильным приведением здесь. Это означает «взять указатель на этот объект без применения какого-либо управления памятью; я обещаю, что буду удерживать его столько, сколько потребуется». (Эта последняя часть просто подразумевается, но если вы этого не сделаете, вы потерпите крах.)

Вы уверены, что self продолжает существовать до тех пор, пока этот аудиоустройство? Если ничто не имеет строгой ссылки на self, то оно исчезнет и inputProcRefCon станет висящим указателем.

Когда вы говорите "не работает в приложении", что вы имеете в виду? Это сбой? Обратный звонок не происходит? Когда происходит обратный вызов, у него нет нужных данных?

1 голос
/ 29 февраля 2012

Мне удалось решить мою проблему, исключив проблемный класс из ARC с помощью флага компилятора -fno-objc-arc.

Это не очень приятный вывод, но, по крайней мере, мое приложение снова работает ... Похоже, мне нужно больше узнать об управлении памятью!

0 голосов
/ 28 февраля 2012

Приведенный ниже код работает для меня с API MusicPlayer.Я не знаю , что это правильно, но я не получаю никаких ошибок или утечек памяти.Надеюсь, это поможет!

// назначить обратный вызов:

 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];
}
...