Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 释放核心基础对象引用 我需要释放一个核心基础对象来清除内存吗?如果是,怎么做_Objective C_Cocoa_Cocoa Touch_Core Foundation - Fatal编程技术网

Objective c 释放核心基础对象引用 我需要释放一个核心基础对象来清除内存吗?如果是,怎么做

Objective c 释放核心基础对象引用 我需要释放一个核心基础对象来清除内存吗?如果是,怎么做,objective-c,cocoa,cocoa-touch,core-foundation,Objective C,Cocoa,Cocoa Touch,Core Foundation,例如,在代码中: ABAddressBookRef addressBook = ABAddressBookCreate(); CFArrayRef peopleArray = ABAddressBookCopyArrayOfAllPeople(addressBook); 我是否需要发布peopleArray?地址簿怎么样 是的,在CoreFoundation中,您必须发布名称中包含Create或Copy的任何内容。您可以使用CFRelease()执行此操作。在您的情况下,您应该同时发布数组和地

例如,在代码中:

ABAddressBookRef addressBook = ABAddressBookCreate();
CFArrayRef peopleArray = ABAddressBookCopyArrayOfAllPeople(addressBook);

我是否需要发布
peopleArray
?地址簿怎么样

是的,在CoreFoundation中,您必须发布名称中包含Create或Copy的任何内容。您可以使用CFRelease()执行此操作。在您的情况下,您应该同时发布数组和地址簿引用。

< P>我建议阅读苹果的核心基础内存管理,以深入讨论这一点。他们也有类似的通用内存管理指南

为了释放CF对象,您将调用<代码> cFrRys函数。

< P>核心基础上的内存管理与COCOA中的内存管理类似:如果返回引用的方法包含“创建”或“复制”一词,则拥有引用,并且必须在该引用上调用<代码> cFrLeasee()/代码>以放弃所有权。否则,您不拥有该引用,必须调用
CFRetain
以获取所有权(需要后续
CFRelease
以放弃该新所有权)。这些规则,取自内存管理程序指南的核心基础是:

  • 如果您创建一个对象(或 直接或通过复制 另一个对象请参见“创建 你拥有它
  • 如果你得到一个 从别的地方来的东西,你知道吗 我不拥有它。如果你想阻止它 被处置后,您必须添加 您自己作为所有者(使用 保留)
  • 如果您是一个 对象,则必须放弃所有权 当你用完它的时候 (使用CFRelease)
在您的示例中,必须同时释放
地址簿
人员阵列
。由于核心代码中没有<代码>自动删除< /COD>等效,如果您从方法返回引用,则返回数组而不释放它。然后,您应该(除非您是邪恶的)在方法名称中包含“create”,以向调用方指示他们现在拥有对返回对象的引用。在本例中,CFArray免费桥接到
NSCFArray
,这是一个从
NSObject
继承的Objective-C对象。因此,您可以将
peopleArray
强制转换为
NSArray*
autorelease
,如果您需要从函数/方法返回它:

return [(NSArray*)peopleArray autorelease];

请注意,这仅适用于免费桥接类。我的理解是,创建自己的免费桥接类相当困难,并且只有基本类(字符串、数组等)CF类是免费桥接的,因此这种方法不总是有效的。最后,如果您可以避免使用自动释放(即,您可以使内存管理更加明确),这可能永远是一件好事。

另一个无人提及的小问题是,一些CF类与NS类有一个“免费桥”
CFString
NSString
CFArray
NSArray
都是示例。这是相关的,因为您可以对这些类使用
release

有关更多信息,请参见此。

有关可以使用的ARC

return (__bridge_transfer NSArray*)peopleArray;

“_桥_转让”将所有权转让给ARC,因此您不需要任何进一步的释放调用

多谢各位。我努力在谷歌上找到答案。可能是因为我在谷歌上搜索的是“核心框架”,而不是“核心基础”。Doh!:)谢谢巴里-我很精通可可的记忆规则-我只是不确定CF规则是否相同。很高兴知道它们是一样的,除了缺少自动释放。。。如果您对Cocoa规则感到满意,并且尽可能避免自动释放,那么您就完全在家了。通过强制转换到id:[(id)cfObject autorelease],可以自动释放免费桥接的对象;对,所以在本例中,CFArrayRef可以被强制转换为NSArray*并自动释放,如[(NSArray*)peopleArray autorelease]中所示。我将把它添加到答案文本中。那么如何返回一个非免费桥接的对象呢?