我对核心基础编程非常陌生,想知道我在想做什么是正确的。我正在使用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_;
}
答案 0 :(得分:2)
它不会导致内存泄漏。实际上,您更有可能遇到从您下面释放的对象的问题,因为默认情况下属性具有assign
属性,这意味着它们不保留(读取:拥有)已分配的对象。
如果您持有足够长的样本缓冲区以使其成为属性,则应该遵循the docs并将样本复制到您自己的缓冲区,而不是保留传递给您的委托的对象:
如果您的应用程序通过保留应用程序导致丢弃样本 提供CMSampleBuffer对象的时间太长,但需要访问 如果样本数据很长一段时间,请考虑复制数据 进入一个新的缓冲区然后释放样本缓冲区(如果是的话) 之前保留的)以便它可以重用它引用的内存。
另一方面,如果你真的想保留对样本缓冲区的引用,你可以保留其他所有内容,并在将它分配给你的属性之前在对象上调用CFRetain
(确保你CFRelease
之前分配的对象)。这与Foundation对象的strong
属性具有等效的语义。