代码之家  ›  专栏  ›  技术社区  ›  rein

释放核心基础对象引用

  •  20
  • rein  · 技术社区  · 16 年前

    例如,在代码中:

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

    peopleArray ?那呢 addressBook

    5 回复  |  直到 16 年前
        1
  •  26
  •   Jason Coco superfell    16 年前

        2
  •  26
  •   Barry Wark    16 年前

    rules Core Foundation中的内存管理与Cocoa中的类似:如果返回引用的方法包含单词“create”或“copy”,则您拥有该引用,并且必须调用 CFRelease() 拥有该引用,必须致电 CFRetain 取得所有权(必然需要后续 CFRelease 放弃新的所有权)。这些规则摘自《Core Foundation内存管理编程指南》:

    • 如果创建对象( 直接或通过复制 另一个对象请参见创建 规则),你拥有它。
    • 不拥有它。如果你想阻止它 正在处理,您必须添加 作为所有者(使用 CF保留)。
    • 如果你是一个所有者 对象,您必须放弃所有权 当你用完它时

    在您的示例中 addressBook 和那个 peopleArray 必须被释放。因为没有 autorelease 在Core Foundation中等效,如果您从方法返回a引用,请返回数组 没有 释放它。你应该(除非你是邪恶的)在方法名称中包含“create”,以向调用者表明他们现在拥有对返回对象的引用。在这种情况下,CFArray是免费桥接到 NSCFArray ,一个继承自的Objective-C对象 NSObject 。这样你就可以投 people阵列 到a NSArray* 自动释放 如果你需要从函数/方法返回它:

    return [(NSArray*)peopleArray autorelease];
    

    请注意,这仅适用于免费桥接类。我的理解是,很难制作自己的免费桥接类,只有原始(字符串、数组等)CF类是免费桥接的,所以这种方法并不总是有效。最后,如果你能避免使用 自动释放 (也就是说,你可以让你的内存管理更加明确),这可能总是一件好事。

        3
  •  4
  •   Community CDub    8 年前

    另一个还没有人提到的小问题是,一些CF类与NS类有一个“免费桥梁”。 CFString NSString , CFArray NSArray 这两个例子。这是相关的,因为你可以直接使用 release 这些类。

    other StackOverflow question 了解更多信息。

        4
  •  3
  •   Marc W    16 年前

    我建议你阅读苹果的 guide 对Core Foundation内存管理进行了深入探讨。他们也有类似的通用Cocoa内存管理指南。

    要释放CF对象,您可以调用 CFRelease 功能。

        5
  •  3
  •   Stephan    13 年前

    对于ARC,您可以使用。

    return (__bridge_transfer NSArray*)peopleArray;
    

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