#objective-c #nsdictionary #exc-bad-access #objective-c
#objective-c #nsdictionary #исключение-bad-access #objective-c
Вопрос:
Я пытаюсь сохранить параметры audiounit в NSDictionary, используя следующий метод.
OSStatus AudioEngineModel::getParameterStateOfEffect(NSInteger nEffectID, CFDictionaryRef * pcfDictRef_ParameterData, UInt32* pun32DataSize)
{
Boolean outWritable;
OSStatus err= AudioUnitGetPropertyInfo(m_aEffectNodes[nEffectID].audioUnit, kAudioUnitProperty_ClassInfo, kAudioUnitScope_Global, 0, amp;*pun32DataSize, amp;outWritable);
if(err != noErr)
{
NSLog(@"ERROR AudioEngineModel::getParameterStateOfEffect:: AudioUnitGetPropertyInfon");
return err;
}
*pcfDictRef_ParameterData= (CFDictionaryRef)malloc(*pun32DataSize);
err= AudioUnitGetProperty (m_aEffectNodes[nEffectID].audioUnit, kAudioUnitProperty_ClassInfo, kAudioUnitScope_Global, 0, (void*)*pcfDictRef_ParameterData, amp;*pun32DataSize);
if(err != noErr)
{
NSLog(@"ERROR AudioEngineModel::getParameterStateOfEffect:: AudioUnitGetPropertyn");
return err;
}
m_cfDictRef_ParameterData= *pcfDictRef_ParameterData;
m_pdParameterData= [NSDictionary dictionaryWithDictionary:(NSDictionary*)m_cfDictRef_ParameterData];
return noErr;
}
Все работает отлично до NSDictionary dictionaryWithDictionary:
вызова, где я постоянно получаю exc_bad_access.
Я вызываю этот метод следующим образом.
CFDictionaryRef cfDictRef_ParameterData;
UInt32 un32DataSize;
OSStatus err= [[[NSApp delegate] getMainController] getParameterStateOfEffect:m_nEffectTypeID parameterData:amp;cfDictRef_ParameterData dataSize:amp;un32DataSize];
Ответ №1:
Ваша проблема в этих строках:
*pcfDictRef_ParameterData= (CFDictionaryRef)malloc(*pun32DataSize);
err= AudioUnitGetProperty (m_aEffectNodes[nEffectID].audioUnit, kAudioUnitProperty_ClassInfo, kAudioUnitScope_Global, 0, (void*)*pcfDictRef_ParameterData, amp;*pun32DataSize);
malloc не нужен. AudioUnitGetProperty вернет CFDictionaryRef для kAudioUnitProperty_ClassInfo. Поскольку pcfDictRef_ParameterData уже является CFDictionaryRef* , вам не нужно ничего выделять.
Вам действительно нужно передать указатель на CFDictionaryRef (без разыменования) в AudioUnitGetProperty. Итак, вторая строка должна быть:
err= AudioUnitGetProperty (m_aEffectNodes[nEffectID].audioUnit, kAudioUnitProperty_ClassInfo, kAudioUnitScope_Global, 0, (void*)pcfDictRef_ParameterData, pun32DataSize);
вместо этого.
Комментарии:
1. Но как мне создать CFDictionaryRef с помощью CFDictionaryCreate, если я не могу получить доступ к ключам / значениям моего * pcfDictRef_ParameterData. Я пытался, но вызов этих методов дает мне другой exc_bad_acess.
2. Я также попытался поместить данные из pcfDictRef_ParameterData в объект NSData следующим образом: m_pParameterData= [NSData dataWithBytes:(const void )*pcfDictRef_ParameterData длина: * pun32DataSize]; Это позволяет мне хранить данные здесь, но когда я вызываю bytes или getBytes: длина: я получаю другой exc_bad_access. Есть идеи?
3. Не понял, что вызов вернул CFDictionaryRef для этого свойства. Итак, что произойдет, если вы избавитесь от вызова malloc и просто используете: err= AudioUnitGetProperty (m_aEffectNodes[nEffectID].AudioUnit, kAudioUnitProperty_ClassInfo, kAudioUnitScope_Global, 0, (void*)pcfDictRef_ParameterData, pun32DataSize); Кроме того, зачем использовать amp; * pun32DataSize (вместо просто pun32DataSize) в вызове AudioUnitGetPropertyInfo?
4. Я удалил malloc и после AudioUnitGetProperty() попытался выполнить это m_pdParameterData= [NSDictionary dictionaryWithDictionary:(NSDictionary *)*pcfDictRef_ParameterData]; и снова получил exc_bad_access при вызове NSDictionary. amp;*pun32DataSize был просто глупой ошибкой. Спасибо, что указали на это.
5. Вы изменили свойство AudioUnitGetProperty, чтобы использовать (void *) pcfDictRef_ParameterData вместо (void *)*pcfDictRef_ParameterData?