我正在尝试管理应用程序中的钥匙串列表。我得到了这样的钥匙串列表:
// _keychains is an instance variable in AppDelegate
_keychains = [NSArray array];
SecKeychainCopySearchList((CFArrayRef *)&_keychains);
所以基本上我得到CFArrayRef
并将其转换为NSArray
。现在我的问题是如何释放keychain ref对象(不透明的结构)?我是否必须将NSArray
转换为CFArrayRef
并使用CFRelease
(根据文档)或者是否可以客观地释放内存?
答案 0 :(得分:2)
您应该只需在阵列上调用release
即可。 release
将释放数组并释放内容,就像在Cocoa中一样。
在这种情况下,毫无疑问如何发布CF / NS-Array,并且在容器释放之前您不必担心元素的生命周期。
即使通过SecKeychainRef
发送CFRelease
是非法的,您仍然应该期望这样做,因为系统应该做正确的事情。 CoreFoundation集合和分配器API提供对分配器和存储回调的足够控制,安全框架应该做正确的事情即使在事件中,数组的内容与默认行为不兼容(CFRelease
在这种情况下)。他们可以提供自己的回调和分配器。由于我没有看到明显偏离默认行为的文档,我认为在数组上调用release
是安全的,并且元素要么与CF引用计数过程兼容,要么集合使用了自定义分配器和/或回调方案(由Security提供)并将根据需要清理元素(我的猜测是前者)。
答案 1 :(得分:1)
完成[_keychains release]
后,您就可以_keychains
。 _keychains
对象将在取消分配release
时向其每个元素发送_keychains
消息。