在VideoToolbox中将NSDictionary转换为CFDictionary

时间:2017-07-13 01:32:25

标签: objective-c exc-bad-access video-toolbox cfdictionary

之间的区别是什么
const void *keys[] = { kCVPixelBufferPixelFormatTypeKey };
OSStatus pixelFormatType = kCVPixelFormatType_32BGRA;
CFNumberRef pixelFormatTypeRef = CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &pixelFormatType);
const void *values[] = { pixelFormatTypeRef };
CFDictionaryRef destinationImageBufferAttrs = CFDictionaryCreate(kCFAllocatorDefault, keys, values, 1, NULL, NULL);

CFDictionaryRef destinationImageBufferAttrs = (__bridge CFDictionaryRef)(@{(NSString*)kCVPixelBufferPixelFormatTypeKey:@(kCVPixelFormatType_32BGRA)});

如果我使用第二个错误,我会收到EXC_BAD_ACCESS错误。为什么呢?

2 个答案:

答案 0 :(得分:1)

在您的第一个代码示例中,存储在destinationImageBufferAttrs中的引用是拥有的,必须稍后使用CFRelease释放(或转移到ARC控件)。

在第二个代码示例中,存储到destinationImageBufferAttrs的引用处于ARC控制之下,ARC可以在分配后立即释放它,因为不再有ARC拥有的引用。

__bridge更改为__bridge_retained以将所有权从ARC转移到您自己的代码,然后您将负责为该对象调用CFRelease

答案 1 :(得分:0)

事实证明,当我想再次访问@{}时,CFDictionaryRef字面值未被保留。所以下面的代码将起作用:

NSDictionary *dic = @{(NSString*)kCVPixelBufferPixelFormatTypeKey:@(kCVPixelFormatType_32BGRA)}; // "dic" reference will retain the nsdic created with @ literal
CFDictionaryRef destinationImageBufferAttrs = (__bridge CFDictionaryRef)dic;