Как сохранить cfdictionaryref в NSDictionary

#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?