释放非免费桥接对象的NSArray

时间:2011-10-22 16:28:40

标签: objective-c memory-management keychain

我正在尝试管理应用程序中的钥匙串列表。我得到了这样的钥匙串列表:

// _keychains is an instance variable in AppDelegate
_keychains = [NSArray array];
SecKeychainCopySearchList((CFArrayRef *)&_keychains);

所以基本上我得到CFArrayRef并将其转换为NSArray。现在我的问题是如何释放keychain ref对象(不透明的结构)?我是否必须将NSArray转换为CFArrayRef并使用CFRelease(根据文档)或者是否可以客观地释放内存?

2 个答案:

答案 0 :(得分:2)

您应该只需在阵列上调用release即可。 release将释放数组并释放内容,就像在Cocoa中一样。

在这种情况下,毫无疑问如何发布CF / NS-Array,并且在容器释放之前您不必担心元素的生命周期。

即使通过SecKeychainRef发送CFRelease是非法的,您仍然应该期望这样做,因为系统应该做正确的事情。 CoreFoundation集合和分配器API提供对分配器和存储回调的足够控制,安全框架应该做正确的事情即使在事件中,数组的内容与默认行为不兼容(CFRelease在这种情况下)。他们可以提供自己的回调和分配器。由于我没有看到明显偏离默认行为的文档,我认为在数组上调用release是安全的,并且元素要么与CF引用计数过程兼容,要么集合使用了自定义分配器和/或回调方案(由Security提供)并将根据需要清理元素(我的猜测是前者)。

答案 1 :(得分:1)

完成[_keychains release]后,您就可以_keychains_keychains对象将在取消分配release时向其每个元素发送_keychains消息。