【问题标题】:iPhone how to properly handle Core Foundation references with ARC?iPhone 如何使用 ARC 正确处理 Core Foundation 引用?
【发布时间】:2012-04-27 02:05:03
【问题描述】:

我对核心基础编程非常陌生,想知道我想做的事情是正确的。我正在使用 ARC,但不确定它如何处理非对象引用。我需要保存对示例缓冲区的引用并稍后在应用程序中使用它。这可能吗,或者会在此之前释放样本缓冲区吗?

将使用 self.sampleBuffer = sampleBuffer_;导致内存泄漏?是否需要在此调用之后添加手动释放?

@property (nonatomic)CMSampleBufferRef sampleBuffer;

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer_ fromConnection:(AVCaptureConnection *)connection
{
    //does this cause memory leak?
    self.sampleBuffer = sampleBuffer_;
}

【问题讨论】:

    标签: iphone objective-c ios reference core-foundation


    【解决方案1】:

    它不会导致内存泄漏。事实上,您更有可能遇到从您下方释放的对象的问题,因为属性默认具有 assign 属性,这意味着它们不保留(读取:拥有)分配的对象。

    如果您持有样本缓冲区的时间足够长,需要将其作为属性,您可能应该遵循the docs 并将样本复制到您自己的缓冲区,而不是持有交给您的委托的对象:

    如果您的应用程序通过保留 提供 CMSampleBuffer 对象的时间过长,但它需要访问 样本数据较长时间,考虑复制数据 进入一个新的缓冲区,然后释放样本缓冲区(如果它是 以前保留),以便它引用的内存可以被重用。

    另一方面,如果您真的想保留对样本缓冲区的引用,您可以保留其他所有内容,并在将对象分配给您的属性之前调用CFRetain(确保您@987654325 @之前分配的对象)。这与 Foundation 对象的 strong 属性具有等效的语义。

    【讨论】:

    • 明确地说,ARC 对 Core Foundation 对象没有任何影响。它不会尝试自动管理它们,因此您需要 manually manage 它们。某些 CF 类型可免费桥接到 Cocoa 类型。因为 ARC确实管理 Cocoa 对象,所以您必须小心地在这些世界之间架起桥梁。
    • ... 这并不像听起来那么难。如果您从 CF 函数(包括 CG 等)中获取它,则它位于 CF-land 中,因此不受 ARC 管理。您可以通过 __bridge_transfer 演员(或 CFBridgingRelease)让 ARC 为您释放它。如果您从 Cocoa 或 Cocoa Touch 函数或方法中获取它,则它位于 Objective-C 领域,因此由 ARC 管理。您可以使用__bridge_retained 演员(或CFBridgingRetain)将其转移到CF 世界,之后您必须CFRelease 它(或将其转移回ARC)。
    • 感谢您的澄清!
    猜你喜欢
    • 2012-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-18
    • 1970-01-01
    • 2021-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多