objective-c - [AVAssetWriterInput requestMediaDataWhenReadyOnQueue :usingBlock:] 的内存问题

标签 objective-c ios memory-management avfoundation

我正在编写一个库以使用 AVFoundation 将 Assets 导出到文件。我创建了一个读取器和一个写入器,将输入和输出连接到这些,然后对输入调用 requestMediaDataWhenReadyOnQueue 方法以开始提取数据。提供给此方法的 block 回调看起来有点像这样:

[input requestMediaDataWhenReadyOnQueue:queue usingBlock:^{
    while ([input isReadyForMoreMediaData]) {
        CMSampleBufferRef buffer;
        // The track has some more data for us
        if ([reader status] == AVAssetReaderStatusReading
               && (buffer = [output copyNextSampleBuffer])) {
            BOOL result = [input appendSampleBuffer:buffer];
            CFRelease(buffer);
            if (!result) {
                // handle error
                break;
            }
        // The track is finished, for whatever reason
        } else {
            [input markAsFinished]; ⬅
            switch ([reader status]) {
                // inspect the status and act accordingly
            }
        }
    }
}];

这在 iOS 5 上完美运行,但在 iOS 4 上,代码在标有 ⬅ 箭头的行之后死于 EXC_BAD_ACCESS。经过一番探索后,我觉得在将输入标记为完成后,该 block 以某种方式立即被破坏了。在执行错误行之前完全有效的 self 指针不知何故变成了 0xfff… 或调试器报告的一些垃圾值。但是之前指向它的对象没有问题,正如僵尸工具所确认的那样,它没有被释放。

我错过了什么?

最佳答案

看到相同(相似)的问题。 iOS5开心,iOS4.3.5不开心。有兴趣了解您最终发现的内容。

通过在 requestMedatWhenReadyOnQueue block 之前显式保留写入器、写入器输入、读取器、读取器输出并在 else 子句的最后显式释放所有四个来绕过它。

文档确实说在标记完成后,“该 block 应该退出。”也许他们不是在开玩笑。如果您执行除退出之外的任何操作,则为错误。不过,上述解决方法似乎可行。

更新:我仍然发现它偶尔会崩溃,即使在保留和释放所有 Assets 对象之后也是如此。正如您的问题所观察到的,它在您将编写器输入标记为完成后不久就崩溃了,就好像 block 本身正在被释放一样。而不是仅仅将 block 作为函数的一部分传递。我创建了一个复制的 block 属性,它是一个长生命周期对象的一部分。我用 Block_copy 初始化它,只在长生命周期对象的析构函数中释放它。这似乎可以解决问题。从那以后,我再也没有看到任何 4.3.5 崩溃。

关于objective-c - [AVAssetWriterInput requestMediaDataWhenReadyOnQueue :usingBlock:] 的内存问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8974679/

相关文章:

c - 将数组 segmentation 为较小的数组不会返回正确的结果

c++ - std::vector 保留方法无法分配足够的内存

iOS 相当于 [NSColor colorUsingColorSpaceName :NSCalibratedRGBColorSpace]

objective-c - 格式字符串,带前导零的整数

ios - 无法使用 make 命令创建 iOS 静态库 .a 文件

ios - 创建精简版,使用多个目标,如何避免覆盖完整版?

ios - 在 inputAccessoryView 上方插入 subview

ios - SKAction playSoundFileNamed 没有通过 iphone 扬声器播放音频

iphone - 水平翻转动画期间的背景颜色

c++ - 进程退出,返回值 3221226356