首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在VideoToolbox中将NSDictionary转换为CFDictionary

在VideoToolbox中将NSDictionary转换为CFDictionary
EN

Stack Overflow用户
提问于 2017-07-13 09:32:25
回答 2查看 1.5K关注 0票数 0

两者的区别是什么

代码语言:javascript
复制
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);

代码语言:javascript
复制
CFDictionaryRef destinationImageBufferAttrs = (__bridge CFDictionaryRef)(@{(NSString*)kCVPixelBufferPixelFormatTypeKey:@(kCVPixelFormatType_32BGRA)});

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-13 09:55:11

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

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

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

票数 1
EN

Stack Overflow用户

发布于 2017-07-13 09:46:57

结果是,当我想再次访问时,在放入CFDictionaryRef之后,@{}文本没有保留。所以下面的代码将会起作用:

代码语言:javascript
复制
NSDictionary *dic = @{(NSString*)kCVPixelBufferPixelFormatTypeKey:@(kCVPixelFormatType_32BGRA)}; // "dic" reference will retain the nsdic created with @ literal
CFDictionaryRef destinationImageBufferAttrs = (__bridge CFDictionaryRef)dic;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45070041

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档