objective-c - 如何将 cfdictionaryref 存储到 NSDictionary 中

标签 objective-c nsdictionary exc-bad-access objective-c++

我正在尝试使用以下方法将音频单元的参数存储到 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, &*pun32DataSize, &outWritable);
    if(err != noErr)
    {
        NSLog(@"ERROR AudioEngineModel::getParameterStateOfEffect:: AudioUnitGetPropertyInfo\n");
        return err;
    }

    *pcfDictRef_ParameterData= (CFDictionaryRef)malloc(*pun32DataSize);

    err= AudioUnitGetProperty (m_aEffectNodes[nEffectID].audioUnit, kAudioUnitProperty_ClassInfo, kAudioUnitScope_Global, 0, (void*)*pcfDictRef_ParameterData, &*pun32DataSize);
    if(err != noErr)
    {
        NSLog(@"ERROR AudioEngineModel::getParameterStateOfEffect:: AudioUnitGetProperty\n");
        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:&cfDictRef_ParameterData dataSize:&un32DataSize];

最佳答案

您的问题在于以下几行:

*pcfDictRef_ParameterData= (CFDictionaryRef)malloc(*pun32DataSize);

err= AudioUnitGetProperty (m_aEffectNodes[nEffectID].audioUnit, kAudioUnitProperty_ClassInfo, kAudioUnitScope_Global, 0, (void*)*pcfDictRef_ParameterData, &*pun32DataSize);

malloc 是不必要的。 AudioUnitGetProperty 将返回 kAudioUnitProperty_ClassInfo 的 CFDictionaryRef。由于 pcfDictRef_ParameterData 已经是 CFDictionaryRef*,因此您不需要分配任何内容。

您确实需要将 CFDictionaryRef(未取消引用)的指针传递给 AudioUnitGetProperty。所以第二行应该是:

err= AudioUnitGetProperty (m_aEffectNodes[nEffectID].audioUnit, kAudioUnitProperty_ClassInfo, kAudioUnitScope_Global, 0, (void*)pcfDictRef_ParameterData, pun32DataSize);

相反。

关于objective-c - 如何将 cfdictionaryref 存储到 NSDictionary 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5942705/

相关文章:

ios - NSMutableDictionary isKindOfClass NSDictionary 为 false

iphone - iOS内存警告tableView EXC_BAD_ACCESS在多 View 应用程序中崩溃

iphone - 结构分配上的 EXC_BAD_ACCESS——不知道为什么会这样

ios - 调用通知时 BAD_ACCESS

objective-c - 当初始值设定项不是编译时常量时,在 Swift 中使用 C 宏

iphone - 判断一个字符串是否为数字

ios - NSPredicates 可以用来用字典中的值替换数组中的对象吗?

iphone - LLDB 和 GDB 调试器之间的区别

objective-c - 命令行 Objective-C 程序如何创建其主 NSThread 线程?

ios - 无论如何在 Objective-C 中有一系列双对象