首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Unmanaged<AnyObject>!在NSMutableDictionary中作为密钥

使用Unmanaged<AnyObject>!在NSMutableDictionary中作为密钥
EN

Stack Overflow用户
提问于 2014-06-14 01:20:21
回答 1查看 3.7K关注 0票数 4

我正在尝试创建一个密钥链查询,但在使用属性项键作为字典键时遇到了困难。在创建字典时,我可以将封装在数组中的属性项作为字典键传递,这样没有任何问题。

代码语言:javascript
运行
复制
genericPasswordQuery = NSMutableDictionary(objects: [kSecClassGenericPassword, identifier], forKeys: [kSecClass, kSecAttrGeneric])

但是,如果我试图在查询中添加另一个类似的项,如下所示:

代码语言:javascript
运行
复制
genericPasswordQuery.setObject(accessGroup, key:kSecAttrAccessGroup)

它抱怨键不符合NSCopying,并提供了类型错误:

“无法找到接受所提供参数的'setObject‘的重载”

这是SecItemAdd的标准实现,但我在Swift中有问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-14 20:25:55

我想我想出了解决办法。来自docs

当Swift导入尚未注释的API时,编译器无法自动管理返回的Core对象。Swift将这些返回的对象封装在一个非托管结构中。所有间接返回的对象也都是非管理的。 当从未注释的API接收到非托管对象时,应在使用它之前立即将其转换为内存托管对象。这样,Swift就可以为您处理内存管理。非托管结构提供了将非托管对象转换为内存托管对象的两种方法-takeUnretainedValue()和takeRetainedValue()。

目前的执行情况:

代码语言:javascript
运行
复制
genericPasswordQuery = NSMutableDictionary(objects: [kSecClassGenericPassword, identifier], forKeys: [kSecClass, kSecAttrGeneric])

var kSecAttrAccessGroupSwift: NSString = kSecAttrAccessGroup.takeRetainedValue() as NSString
genericPasswordQuery.setObject(accessGroup, forKey: kSecAttrAccessGroupSwift)

这在Xcode中运行良好,但是当我添加.takeRetainedValue时,游乐场会立即崩溃

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24215757

复制
相关文章

相似问题

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