Objective c 释放非免费桥接对象的NSArray

Objective c 释放非免费桥接对象的NSArray,objective-c,memory-management,keychain,Objective C,Memory Management,Keychain,我正在尝试管理应用程序中的密钥链列表。我得到的钥匙链列表如下: // _keychains is an instance variable in AppDelegate _keychains = [NSArray array]; SecKeychainCopySearchList((CFArrayRef *)&_keychains); 所以基本上我得到了CFArrayRef并将其转换为NSArray。现在我的问题是如何释放keychain ref对象(不透明结构)?我是否必须将NSAr

我正在尝试管理应用程序中的密钥链列表。我得到的钥匙链列表如下:

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

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

当您使用
\u钥匙链时,只需执行
[\u钥匙链释放]
。解除分配
\u keychains
时,
\u keychains
对象将向其每个元素发送
release
消息。

您只需在数组上调用
release
release
将释放数组并释放内容,就像在Cocoa中一样

在这种情况下,毫无疑问如何释放CF/NS阵列,在容器释放之前,您不需要担心元素的生存期


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

但问题是,
\u键链
数组不包含对象。它保存了
SecKeychainRef
的不透明结构。我不确定他们是否对任何消息作出回应,因为文档只保存了F to操作它们。它们可以传递给CFRelease。不管怎么说,苹果编写了填充NSArray的代码,苹果知道NSArray会向其元素发送发布。所以你不用担心。