3

我对核心基础编程很陌生,想知道我想做的事情是正确的。我正在使用 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_;
}
4

1 回答 1

2

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

如果您持有样本缓冲区足够长的时间以使其成为一个属性,您可能应该按照文档并将样本复制到您自己的缓冲区,而不是持有交给您的委托的对象:

如果您的应用程序由于保留提供的 CMSampleBuffer 对象太久而导致样本被丢弃,但它需要长时间访问样本数据,请考虑将数据复制到新缓冲区中,然后释放样本缓冲区(如果它以前被保留)以便它引用的内存可以被重用。

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

于 2012-04-27T02:13:39.223 回答