2012-04-27 57 views
3

我对核心基础编程非常陌生,想知道我在做什么是正确的。我正在使用ARC,我不确定它如何处理非对象引用。我需要保存对示例缓冲区的引用,并稍后在应用程序中使用它。这是可能的,还是将样本缓冲区在此之前解除分配?iPhone如何正确处理与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_; 
} 

回答

2

它不会导致内存泄漏。实际上,由于属性默认具有assign属性,这意味着它们不会保留(读取:拥有)所分配的对象,所以更有可能遇到从您之下发布的对象中的问题。

如果你持有到样品缓冲液足够长的时间需要它的属性,你应该遵循the docs和样本复制到自己的缓冲区,而不是抓着交给您的代理对象:

如果您的应用程序导致样品通过保留时间过长 提供CMSampleBuffer对象被删除,但需要访问 为很长一段时间的样本数据,考虑 将数据复制到一个新的缓冲区,然后释放样本缓冲区(如果它以前保留了 ),以便它引用的内存可以被重用。

在另一方面,如果你真的想保持到样品缓冲液的参考,你可以保持一切,因为它是和调用CFRetain的对象将其分配给您的属性之前(确保你CFRelease之前分配的对象)。这与Foundation对象的strong属性具有等效的语义。

+4

要明确,ARC对Core Foundation对象无任何影响。它不会尝试自动管理它们,因此您需要[手动管理](https://developer.apple.com/library/mac/#documentation/CoreFOundation/Conceptual/CFMemoryMgmt/Concepts/Ownership.html)。一些CF类型可以免费桥接到Cocoa类型。因为ARC *管理可可物体,所以你必须小心地在这些世界之间搭桥。 – 2012-04-27 03:37:40

+1

......这听起来不那么难。如果你从CF功能(包括CG等)获得它,它在CF-land中,因此不由ARC管理。你可以让ARC用'__bridge_transfer' cast(或'CFBridgingRelease')为你发布它。如果您从Cocoa或Cocoa Touch功能或方法获得它,则它位于Objective-C-land中,因此由ARC进行管理。你可以用'__bridge_retained' cast(或'CFBridgingRetain')将它传递给CF世界,之后你需要'CFRelease'(或者将它传回ARC)。 – 2012-04-27 03:54:27

+0

感谢您的澄清! – 2012-04-27 11:52:18