繁体   English   中英

iPhone如何使用ARC正确处理Core Foundation引用?

[英]iPhone how to properly handle Core Foundation references with ARC?

我对核心基础编程非常陌生,想知道我在想什么是正确的。 我正在使用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_;
}

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

如果您持有足够长的样本缓冲区以使其成为属性,则应该按照文档将样本复制到您自己的缓冲区,而不是保留传递给您的委托的对象:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM